Heim >Backend-Entwicklung >PHP-Tutorial >Warum überschreibt die Foreach-Schleife von PHP mit Referenzen das letzte Array-Element?

Warum überschreibt die Foreach-Schleife von PHP mit Referenzen das letzte Array-Element?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-27 14:37:14314Durchsuche

Why Does PHP's Foreach Loop with References Overwrite the Last Array Element?

Unerwartetes Verhalten der Foreach-Schleife bei der Verwendung von Referenzen

Bei der Verwendung der foreach-Schleife von PHP mit Referenzen kann seltsames Verhalten auftreten, wie das folgende Codefragment zeigt :

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
foreach ($a as $v) { }

print_r($a);

Dieser Code soll mithilfe einer Referenz das Array $a durchlaufen Variable $v in der ersten Schleife und eine Nicht-Referenzvariable $v in der zweiten Schleife. Überraschenderweise zeigt die Ausgabe jedoch, dass das letzte Element des Arrays, „d“, überschrieben wurde:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => c
)

Erklärung des Verhaltens

Das war unerwartet Das Verhalten ist in der PHP-Dokumentation gut dokumentiert. Es warnt davor, dass bei der Verwendung von Referenzen in einer foreach-Schleife die Referenz des letzten Elements des Arrays auch nach Beendigung der Schleife bestehen bleibt. Um dieses Problem zu vermeiden, wird empfohlen, die Referenzvariable mit unset() zurückzusetzen.

In unserem Beispiel bleibt die Referenzvariable $v nach der ersten Schleife eine Referenz auf das letzte Element von $a. Wenn die zweite Schleife $a durchläuft, weist jede Iteration der Schleife den Wert $v neu zu. Da $v jedoch ein Verweis auf das letzte Element von $a ist, überschreibt es den Wert dieses Elements.

Schritt-für-Schritt-Anleitung zum Verhalten

Zur weiteren Verdeutlichung finden Sie hier eine Schritt-für-Schritt-Anleitung zu den Vorgängen in unserem Codeausschnitt:

  1. Die erste foreach-Schleife weist $v Referenzen jedes Array-Elements zu.
  2. In der zweiten foreach-Schleife verweist $v immer noch auf das letzte Element von $a, 'd'.
  3. Die Schleife iteriert durch $a , wobei jeder Wert $v neu zugewiesen wird.
  4. Da $v eine Referenz auf das letzte Element von $a ist, überschreibt es den Wert dieses Elements mit jedem Iteration.
  5. Das letzte Element von $a wird schließlich mit dem Wert des vorherigen Elements überschrieben.

Lösung

Zu vermeiden Um dieses Problem zu lösen, deaktivieren Sie einfach die Referenzvariable $v nach der ersten Schleife:

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }

Das obige ist der detaillierte Inhalt vonWarum überschreibt die Foreach-Schleife von PHP mit Referenzen das letzte Array-Element?. 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