Heim >Backend-Entwicklung >PHP-Tutorial >Warum wird das letzte Element in der Foreach-Schleife von PHP mit Pass-by-Reference dupliziert?
PHP Foreach Pass by Reference Enigma: Mysterious Last Element Duplication
Wenn Sie in PHP die foreach-Schleife mit einer Pass-by- Bei der Referenzzuweisung (z. B. foreach ($arr as &$item)) kann es zu unerwartetem Verhalten kommen. Betrachten Sie dieses verwirrende Beispiel:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) { /* do nothing by reference */ } print_r($arr); foreach ($arr as $item) { /* do nothing by value */ } print_r($arr); // $arr has inexplicably changed
Dieser Code gibt Folgendes aus:
Array ( [0] => foo [1] => bar [2] => baz ) Array ( [0] => foo [1] => bar [2] => bar )
Erklärung der Duplikation
Nach der ersten foreach-Schleife jedes Element von $arr wird immer noch von $item referenziert. Wenn die zweite Schleife iteriert, ersetzt sie den Wert jedes Elements durch den Wert von $item, das zufällig das letzte Element des Arrays ist. Dies bedeutet, dass jedes Element von $arr auf den Wert von $arr[2] gesetzt wird, was zur Duplizierung des letzten Elements in der Ausgabe führt.
Debuggen der Ausgabe
Um dieses Verhalten zu veranschaulichen, debuggen wir die Ausgabe, indem wir print-Anweisungen zu jeder foreach-Iteration hinzufügen:
foreach ($arr as &$item) { echo "Item: $item<br>"; print_r($arr); echo "<br>"; } foreach ($arr as $item) { echo "Item: $item<br>"; print_r($arr); echo "<br>"; }
Dies gibt Folgendes aus:
Item: foo Array ( [0] => foo [1] => bar [2] => baz ) Item: bar Array ( [0] => foo [1] => bar [2] => baz ) Item: baz Array ( [0] => foo [1] => bar [2] => baz ) Item: foo Array ( [0] => foo [1] => bar [2] => foo ) Item: bar Array ( [0] => foo [1] => bar [2] => bar ) Item: bar Array ( [0] => foo [1] => bar [2] => bar )
Sie können deutlich sehen, dass jedes Element von $arr wird auf den Wert von $item gesetzt, der während der zweiten foreach-Schleife zum letzten Element des Arrays wechselt.
Fehler oder beabsichtigtes Verhalten?
Dies Verhalten ist kein Fehler. Es ist eine Folge der Referenzübergabe. Die foreach-Schleife weist einfach den Wert des aktuellen Elements der im Schleifenheader angegebenen Variablen zu. In diesem Fall ändern wir durch die Referenzierung von $item die ursprünglichen Array-Elemente in der zweiten Schleife. Dies entspricht dem folgenden Code:
for ($i = 0; $i < count($arr); $i++) { $arr[$i] = $item; }
Daher ist das beobachtete Verhalten kein Fehler, sondern ein Ergebnis der beabsichtigten Semantik der Pass-by-Reference in PHP. Um ein solches Verhalten zu vermeiden, verwenden Sie in der zweiten foreach-Schleife die Wertübergabe, indem Sie einfach den Wert jedes Elements $item zuweisen: foreach ($arr as $item).
Das obige ist der detaillierte Inhalt vonWarum wird das letzte Element in der Foreach-Schleife von PHP mit Pass-by-Reference dupliziert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!