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
Barbara StreisandOriginal
2024-11-13 10:54:02587Durchsuche

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 der ersten Schleife das Array wird wie erwartet gedruckt:

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

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

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

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>";
}

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!

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