flufo: seltsames verhalten bei referenzen

hallo forum,

ich habe folgendes script:

----- script --------------------------------------
<pre>
<?php

funktion zum testen ob zwei arrays auf

den selben inhalt referenzieren

function isSame($first,$second)
{
    # das ich nach ..st['self'].. abfrage
    # hat den hintergrund das ja eine kopie
    # übergeben wird und somit auf dem ersten
    # level keine instanz möglich wäre
    $first['self']['uniqueName'] = true;

if(isset($second['self']['uniqueName']))
        echo "same\n";
    else
        echo "NOT same\n";

unset($first['self']['uniqueName']);
}

recursives array erstellen

$array = array();
$array['self'] =& $array;

isSame($array,$array['self']);

beliebige referenz setzen

$foo =& $array;

isSame($array,$array['self']);

beliebige referenz wieder löschen

unset($foo);

isSame($array,$array['self']);

?>
</pre>
----- /script --------------------------------------

wenn ich dieses ausführe bekomme ich folgende ausgabe:

----- ausgabe --------------------------------------
NOT same
same
NOT same
----- /ausgabe --------------------------------------

meines erachtens sollte aber jedes mal "same" rauskommen(?)
wieso muss erst eine beliebige referenz bestehen damit es funzt? eigentlich sollte es da doch keinen zusammenhang geben?

getestet auf 4.3.3 und 5.0.0 beta 4 jeweils auf win32

ist das gewollt bzw. resultierend? und wenn woraus? ich komme nicht drauf ... wäre sehr dankbar wenn mir wer einen hinweis geben kann.

beste grüße - flufo

  1. hallo flufo,

    oha ein quasy-Xenonsches Paradoxon ;)
    Du erweiterst $array durch die Recursion auf $array mit Index 'self':

    ==========
    $array = array();
    $array['self'] =& $array;

    Nun gib doch einfach mal "beide" array aus:

    ==========
    print_r($array);
    print_r($array['self']);

    Ergibnis:
    ----------
    Array
    (
       [self] => Array
     *RECURSION*
    )
    Array
    (
       [self] => Array
     *RECURSION*
    )
    ----------

    Streng nach dieser Ausgabe von print_r() sind diese "beiden" array identisch. Da es sich aber um EIN array handelt ist der Vergleich ja folgender

    $array===$array['self']===$array['self']['self']===$array['self']['self']['self']=== usw.

    Ist Unendlich === Unendlich+1? Der Rechner scheint dazu nein zu sagen - genauso wie der Hase die Schildkröte nicht einholen kann, wenn diese sich ja immer weiterbewegt ;)

    Gruß aus Berlin!
    eddi

    1. $array===$array['self']===$array['self']['self']===$array['self']['self']['self']=== usw.

      Ist Unendlich === Unendlich+1? Der Rechner scheint dazu nein zu sagen - genauso wie der Hase die Schildkröte nicht einholen kann, wenn diese sich ja immer weiterbewegt ;)

      das ist schon klar das da eine recursion drin steckt. die ist ja auch gewollt (kann man viele tolle sachen mit machen ;-) ).
      mein problem ist das ich diese recursion entdecken möchte. und dafür muss ich halt raus bekommen ob zwei arrays auf den selben inhalt verweisen. bzw. genauer gesagt ob eins der kinderelemente eines mehrdimensionalen arrays auf einen seiner eltern verweist.

      das funktioniert ja auch (im meinem beispiel im mittleren fall) was mir unklar ist aus welchen gründen das im ersten und zweiten beispiel nicht will...

      grüße - flufo