Nach der ersten foreach-Schleife $item
wird immer noch auf einen Wert verwiesen, der auch von verwendet wird $arr[2]
. Jeder foreach-Aufruf in der zweiten Schleife, der nicht als Referenz aufgerufen wird, ersetzt diesen Wert und damit $arr[2]
den neuen Wert.
Also Schleife 1, den Wert und $arr[2]
werden $arr[0]
, was 'foo' ist.
Schleife 2, der Wert und $arr[2]
werden $arr[1]
, was 'bar' ist.
Schleife 3, der Wert und $arr[2]
werden $arr[2]
, was 'bar' ist (wegen Schleife 2).
Der Wert 'baz' geht beim ersten Aufruf der zweiten foreach-Schleife tatsächlich verloren.
Debuggen der Ausgabe
Für jede Iteration der Schleife geben wir den Wert des $item
Arrays wieder und drucken es rekursiv aus $arr
.
Wenn die erste Schleife durchlaufen wird, sehen wir diese Ausgabe:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
Zeigt am Ende der Schleife $item
immer noch auf die gleiche Stelle wie $arr[2]
.
Wenn die zweite Schleife durchlaufen wird, sehen wir diese Ausgabe:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
Sie werden feststellen, dass jedes Mal, wenn ein Array einen neuen Wert einfügt $item
, dieser ebenfalls $arr[3]
mit demselben Wert aktualisiert wird, da beide immer noch auf denselben Speicherort verweisen. Wenn die Schleife den dritten Wert des Arrays erreicht, enthält sie den Wert, bar
da er gerade durch die vorherige Iteration dieser Schleife festgelegt wurde.
Ist es ein Fehler?
Nein. Dies ist das Verhalten eines referenzierten Elements und kein Fehler. Es wäre ähnlich wie beim Ausführen von:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
Eine foreach-Schleife ist nichts Besonderes und kann referenzierte Elemente ignorieren. Sie setzen diese Variable einfach jedes Mal auf den neuen Wert, wie Sie es außerhalb einer Schleife tun würden.