[PHP] Probleem met aanroepen array via pointer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 08:58

Neman

Een uit de lucht gegrepen naam

Topicstarter
Uiteraard heb ik de search gebruikt, maar dit leverde niet precies op wat ik zoek. Via een pointer poog ik een array te vullen, maar dit lukt niet helemaal. De volgende code illustreert het probleem en mijn bedoeling:

PHP:
1
2
3
4
5
6
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointer = &$blaat; // een pointer naar deze array
    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push($pointer["test2"], "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array


Dit geeft als output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [0] => Array
        (
            [test1] => test
            [test2] => Array
                (
                )

        )

)


Deze output zou ik dus willen hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
    [0] => Array
        (
            [test1] => test
            [test2] => Array
                (
                    [0] => TEST
                )

        )

)


Hoe moet ik dit aanpakken?

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Moet je niet gewoon $blaat printen, omdat PHP by default een copie van $blaat meegeeft aan array_push?

Acties:
  • 0 Henk 'm!

Verwijderd

int array_push ( array array, mixed var [, mixed ...])
...
Has the same effect as:

$array[] = $var;
En dat zou dus $array[] = &$var; moeten zijn, lijkt me. Maar sowieso is PHP en pass by reference ... vaaag.

Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 08:58

Neman

Een uit de lucht gegrepen naam

Topicstarter
Glimi schreef op 17 July 2003 @ 20:47:
Moet je niet gewoon $blaat printen, omdat PHP by default een copie van $blaat meegeeft aan array_push?
Nee, dan mis ik een niveau (vind ik ook logisch):
code:
1
2
3
4
5
6
7
8
9
Array
        (
            [test1] => test
            [test2] => Array
                (
                    [0] => TEST
                )

        )
Verwijderd schreef op 17 July 2003 @ 20:48:
[...]

En dat zou dus $array[] = &$var; moeten zijn, lijkt me. Maar sowieso is PHP en pass by reference ... vaaag.
Die notatie is inderdaad equivalent, maar dan zit ik met hetzelfde probleem. Ik moet je gelijk geven dat call by reference vaag is in PHP, in ben het anders gewend in C++ :).

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Hoe gebruik je dit precies? Waarschijnlijk is het het handigst om de data zo laat mogelijk aan $data toe te voegen. Zelf heb ik idd ook een tijd zitten stoeien met zoiets (maar dan met klassen). Ik bouwde een boom topdown op en daardoor moest ik steeds een pointer naar een sub-tak hebben enzo... Erg fijn ging het niet met php's manier van call by reference... Uiteindelijk heb ik de boom maar bottomup gemaakt, waarbij nieuwe takken eerst gemaakt werden en daarna pas de root, zodat de hele boom zonder een enkele call-by-ref toch efficient opgebouwd kon worden.

PHP:
1
2
3
4
5
6
7
8
9
<?
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointer = &$blaat; // een pointer naar deze array
    $pointer2 = &$pointer["test2"];
    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push($pointer2, "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array
?>

Levert:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
    [0] => Array
        (
            [test1] => test
            [test2] => Array
                (
                    [0] => TEST
                )

        )

)

Op, waarom deze wel werkt mag Joost weten, ik weet het iig niet :o

[ Voor 40% gewijzigd door ACM op 17-07-2003 21:07 ]


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 08:58

Neman

Een uit de lucht gegrepen naam

Topicstarter
Daar ben ik dus ook precies mee bezig: het topdown opbouwen van een boom :). Wat een ellende met PHP, het slaat echt nergens op dat het via deze weg wel werkt :D. Ik ga eens even kijken of ik de boel werkend kan krijgen middels deze workaround :).

Trouwens, dit is echt wazig:
PHP:
1
2
3
4
5
6
7
8
9
<?
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointer = &$blaat; // een pointer naar deze array
    $pointer2 = &$pointer["test2"];
    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push(&$pointer["test2"], "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array
?>


en

PHP:
1
2
3
4
5
6
7
8
9
<?
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointer = &$blaat; // een pointer naar deze array
    //$pointer2 = &$pointer["test2"];
    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push(&$pointer["test2"], "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array
?>


zijn niet equivalent, terwijl in beide gevallen $pointer2 niet eens gebruikt wordt? :o

Hoe dan ook, volgens mij is dit de beste oplossing:
PHP:
1
2
3
4
5
6
7
8
<?
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointer = &$blaat["test2"]; // een pointer naar deze array
    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push($pointer, "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array
?>


Die werkt wel, maar als ik hem vervolgens iets uitbreid en de pointer in een array opsla, dan werkt het weer niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
    $data = array(); // een lege array
    $blaat = array("test1" => "test", "test2" => array()); // array met wat testdata
    $pointerlist = array();

    array_push($pointerlist, &$blaat["test2"]); // een pointer naar deze array
    $pointer = array_pop($pointerlist);

    array_push($data, $blaat); // voeg de array toe aan de lege data-array
    array_push($pointer, "TEST"); // voeg string toe aan subarray binnen de data-array
    print_r($data); // print gehele data-array
?>


Dit is toch niet te geloven? Kan iemand me uitleggen hoe dit allemaal kan? Excuses voor de lange post, maar ik probeer op deze manier de wazige werking van pointers in PHP te verduidelijken :).

[ Voor 132% gewijzigd door Neman op 17-07-2003 21:53 ]


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 08:58

Neman

Een uit de lucht gegrepen naam

Topicstarter
Na heel veel testen ben ik erachter dat je pointers opgeslagen in een array alleen kunt gebruiken als je deze direct aanroept middels een index. Returnen door een functie werkt niet zoals je zou verwachten.

Deze code werkt niet naar behoren:
PHP:
1
2
3
array_push($pointerlist, &$blaat["test2"]); // een pointer naar deze array
$pointer = array_pop($pointerlist);
array_push($pointer, "TEST"); // voeg string toe aan subarray


Deze code wel:
PHP:
1
2
3
array_push($pointerlist, &$blaat["test2"]); // een pointer naar deze array
array_push($pointerlist[count($pointerlist)-1], "TEST"); // voeg string toe aan subarray
array_pop($pointerlist); // verwijder het laatste array-element (die net gebruikt is)

[ Voor 12% gewijzigd door Neman op 18-07-2003 05:00 ]

Pagina: 1