Hallo, Guten Morgen und Mahlzeit alle zusammen,
Wenn man sich (unter Zuhilfenahme von Referenzen) folgendes Array bastelt
$test = array( 1, 2, 3);
$test[] = &$test;
ergibt sich das Problem, dass eine darauf angesetzte Routine zum rekursiven Durchlaufen dieses Array in einem Endloslauf landen würde.
Das klassische Beispiel für so ein Array ist "$GLOBALS", dass in sich eine Referenz auf sich selbst enthält: "$GLOBALS['GLOBALS']".
Setzt man jetzt PHP-Funktionen darauf an, gehen diese ganz unterschiedlich vor:
print_r() meldet ordnungsgemäß diese "unendliche Verschachtelung" mit *RECURSION* -- gleich beim ersten mal.
var_dump() braucht eine Hierarchie-Ebene länger, bevor es mitbekommt, dass da das gleiche Array immer und immer wieder durchlaufen wird.
var_export() dagegen, scheint munter weiterlaufen zu wollen, wird aber irgendwann mit der Fehlermeldung "Fatal error: Nesting level too deep - recursive dependency?" abgebrochen.
Jetzt meine Frage: Wenn ich mir eine solche Funktion wie beispielsweise print_r() selbst schreiben möchte, wie kann ich erkennen, ob ein zu durchlaufendes Array schon mal durchlaufen wurde? Das PHP-Manual schweigt sich dazu aus. Es scheint auch nicht möglich sein, zu erkennen, ob eine Variable eine Referenz oder die "Original-Variable" darstellt.
Ach, ja: array_walk_recursive() hab ich mir schon angeschaut. Allerdings gibts das erst unter PHP5 als eingebaute Funktion, und das array_walk_recursive() aus PEAR_Compat hat keinerlei Abfragen nach Referenzen oder Endlos-Verschachtelungen eingebaut.
MffG
EisFuX