Heim >Backend-Entwicklung >PHP-Tutorial >Warum erscheint das letzte Element eines PHP-Arrays dupliziert, nachdem foreach mit Pass-by-Reference verwendet wurde?
Einführung:
Sind Sie auf ein seltsames Phänomen gestoßen, bei dem das letzte Element Ihres PHP-Arrays erscheint dupliziert, nachdem Sie mit foreach mit Referenzübergabe darüber iteriert haben? Dieses rätselhafte Verhalten wirft häufig Fragen zu potenziellen Fehlern oder seltsamem Systemverhalten auf.
Verstehen des Verhaltens:
Der Schlüssel zum Verständnis liegt in der Natur der Pass-by-Reference in den foreach-Schleifen von PHP. Bei Verwendung von „&“ im Parameter wird der Verweis auf das Array-Element direkt geändert und nicht kopiert. Dies bedeutet, dass alle Änderungen, die an der übergebenen Variablen innerhalb der Schleife vorgenommen werden, sich direkt auf das ursprüngliche Array auswirken.
Der betreffende Fehler:
Im bereitgestellten Beispiel:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} foreach ($arr as $item) {}
Die erste foreach-Schleife stellt Verweise auf die Array-Elemente her. Da $item nun eine Referenz ist, wird durch eine Änderung innerhalb der Schleife auch das entsprechende Array-Element geändert.
Die zweite foreach-Schleife erstellt jedoch keine Referenzen. Das heißt, wenn die Schleife $item neue Werte zuweist, wirkt sich dies nur auf die lokale Kopie aus und aktualisiert nicht das ursprüngliche Array.
Der Duplikationseffekt:
Jetzt Betrachten wir den Fall, in dem $item ein Verweis auf das letzte Array-Element (d. h. „baz“) ist. Da die erste Schleife diese Referenz herstellt, verwendet auch die zweite Schleife dieselbe Referenz. Infolgedessen wird jeder Wert, der $item in der zweiten Schleife zugewiesen wird, direkt an $arr[2] übergeben.
Wenn die zweite Schleife also „bar“ an $item zuweist, ersetzt es versehentlich das letzte Element des Arrays mit „bar“, was zur scheinbaren Duplizierung führt.
Erwartete vs. tatsächliche Ausgabe:
Vor den Schleifen: ["foo", "bar" , "baz"]
Nach der ersten Schleife (Referenz): ["foo", "bar", "foo"] (da $item immer noch auf $arr[2] referenziert wird)
Nach der zweiten Schleife (keine Referenz): ["foo", "bar", "bar"]
Ist es ein Fehler?
Nein, Dieses Verhalten ist kein Fehler. Es ist einfach die erwartete Konsequenz der Verwendung von Referenzen in den foreach-Schleifen von PHP. Der Wert von $item ist ein Verweis auf das ursprüngliche Array-Element und wirkt sich bei jeder Änderung auf das zugrunde liegende Array aus.
Das obige ist der detaillierte Inhalt vonWarum erscheint das letzte Element eines PHP-Arrays dupliziert, nachdem foreach mit Pass-by-Reference verwendet wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!