Heim >Backend-Entwicklung >PHP-Tutorial >Warum wird das letzte Element in einem PHP-Array dupliziert, wenn eine foreach-Schleife mit Referenzübergabe verwendet wird?

Warum wird das letzte Element in einem PHP-Array dupliziert, wenn eine foreach-Schleife mit Referenzübergabe verwendet wird?

Susan Sarandon
Susan SarandonOriginal
2024-11-14 20:19:01449Durchsuche

Why does the last element in a PHP array duplicate when using a foreach loop with pass-by-reference?

PHP Foreach Pass by Reference: Letztes Element-Duplikations-Rätsel enthüllt

Bedenken Sie den folgenden PHP-Code:

$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);

Bei der Ausführung wird das ursprüngliche Array $arr unerwartet geändert, was zu Folgendem führt Ausgabe:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

Verstehen des Verhaltens

Nach der ersten foreach-Schleife bleibt die Variable $item ein Verweis auf denselben Speicherort wie $arr[2] . Folglich ersetzt jede Iteration der zweiten foreach-Schleife, die Argumente nach Wert übergibt, den referenzierten Wert (und damit $arr[2]) durch den Wert der neuen Iteration.

Detaillierte Erklärung

In der ersten Schleife:

  • $item verweist auf den Wert bei $arr[0], Das ist „foo“.
  • $item und $arr[0] zeigen beide auf „foo“.
  • Dieser Vorgang wiederholt sich für $arr[1] und $arr[2].

Am Ende der ersten Schleife zeigt $item immer noch auf $arr[2].

Im zweiten Schleife:

  • $item wird der Wert von $arr[0] zugewiesen, der „foo“ ist.
  • $arr[2] (immer noch von $item referenziert) ist es auch auf 'foo' setzen.
  • Dies überschreibt den ursprünglichen Wert von 'baz' bei $arr[2].
  • Der gleiche Vorgang findet für statt $arr[1] und schließlich wird $arr[2] der Wert von $arr[2] zugewiesen, der aufgrund der vorherigen Iteration jetzt „bar“ ist.

Klarstellung Missverständnis

Dieses Verhalten wird nicht als Fehler angesehen. Es entspricht dem beabsichtigten Verhalten von Referenzen in PHP. Ähnliche Ergebnisse würden beobachtet, wenn Sie die folgende Syntax außerhalb einer Schleife verwenden würden:

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }

Fazit

Bei der Arbeit mit Referenzen in PHP ist es wichtig, dies zu erkennen dass Änderungen, die über die referenzierte Variable vorgenommen werden, auch den ursprünglichen Wert beeinflussen. Dieses Verhalten kann je nach gewünschtem Ergebnis effektiv ausgenutzt oder vermieden werden.

Das obige ist der detaillierte Inhalt vonWarum wird das letzte Element in einem PHP-Array dupliziert, wenn eine foreach-Schleife mit Referenzübergabe verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn