Heim > Backend-Entwicklung > PHP-Tutorial > Warum ändert meine PHP-foreach-Schleife mit Pass-by-Reference mein Array unerwartet?

Warum ändert meine PHP-foreach-Schleife mit Pass-by-Reference mein Array unerwartet?

Barbara Streisand
Freigeben: 2024-11-13 10:54:02
Original
607 Leute haben es durchsucht

Why does my PHP foreach loop with pass-by-reference change my array unexpectedly?

PHP Foreach Pass by Reference: Letztes Element dupliziert? (Bug?)

Das Problem verstehen

Bedenken Sie den folgenden PHP-Code:

$arr = array("foo", "bar", "baz");

foreach ($arr as &$item) {}
print_r($arr);

foreach ($arr as $item) {}
print_r($arr); // $arr has changed to ["foo", "bar", "bar"]
Nach dem Login kopieren

Nach der ersten Schleife das Array wird wie erwartet gedruckt:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Nach dem Login kopieren

Nach der zweiten Schleife ändert sich jedoch das Array unerwartet:

Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)
Nach dem Login kopieren

Erklärung

Das Problem tritt auf, weil die erste foreach-Schleife $item als Referenz übergibt. Das bedeutet, dass $item ein Alias ​​für die Elemente im $arr-Array ist. In der ersten Schleife werden keine Änderungen an $item oder $arr vorgenommen.

Die zweite Schleife übergibt $item jedoch als Wert. Wenn dem Wert von $item in der Schleife ein neuer Wert zugewiesen wird, wird auch das entsprechende Element in $arr geändert.

Konkret wird das dritte Element von $arr („baz“) mit dem Wert von überschrieben das zweite Element („bar“) während der letzten Iteration der zweiten Schleife. Dies erklärt, warum das letzte Element von $arr nach der zweiten Schleife dupliziert wird.

Ist es ein Fehler?

Nein, dieses Verhalten ist kein Fehler. Dies ist das beabsichtigte Verhalten von foreach-Schleifen bei der Übergabe von Variablen als Referenz. Es ist wichtig, sich dieses Verhaltens bewusst zu sein, um unerwartete Änderungen in Ihren Arrays zu vermeiden.

Debuggen der Ausgabe

Um das Verhalten besser zu visualisieren, fügt der folgende Code Echo-Anweisungen hinzu um den Wert von $item und dem Array $arr nach jeder Iteration der Schleifen auszugeben:

echo "<br>";

foreach ($arr as &$item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}

echo "<br>";

foreach ($arr as $item) {
    echo "Item: $item; Arr: ";
    print_r($arr);
    echo "<br>";
}
Nach dem Login kopieren

Die Ausgabe zeigt, wie $item und $arr Änderung während der Schleifen, was das oben beschriebene Verhalten deutlich veranschaulicht.

Das obige ist der detaillierte Inhalt vonWarum ändert meine PHP-foreach-Schleife mit Pass-by-Reference mein Array unerwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage