Heim >Backend-Entwicklung >PHP-Tutorial >Warum wird das letzte Element in der Foreach-Schleife von PHP mit Pass-by-Reference dupliziert?

Warum wird das letzte Element in der Foreach-Schleife von PHP mit Pass-by-Reference dupliziert?

Linda Hamilton
Linda HamiltonOriginal
2024-11-16 19:08:02846Durchsuche

Why Does the Last Element Duplicate in PHP's Foreach Loop with Pass-by-Reference?

PHP Foreach Pass by Reference Enigma: Mysterious Last Element Duplication

Wenn Sie in PHP die foreach-Schleife mit einer Pass-by- Bei der Referenzzuweisung (z. B. foreach ($arr as &$item)) kann es zu unerwartetem Verhalten kommen. Betrachten Sie dieses verwirrende Beispiel:

$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); // $arr has inexplicably changed

Dieser Code gibt Folgendes aus:

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

Erklärung der Duplikation

Nach der ersten foreach-Schleife jedes Element von $arr wird immer noch von $item referenziert. Wenn die zweite Schleife iteriert, ersetzt sie den Wert jedes Elements durch den Wert von $item, das zufällig das letzte Element des Arrays ist. Dies bedeutet, dass jedes Element von $arr auf den Wert von $arr[2] gesetzt wird, was zur Duplizierung des letzten Elements in der Ausgabe führt.

Debuggen der Ausgabe

Um dieses Verhalten zu veranschaulichen, debuggen wir die Ausgabe, indem wir print-Anweisungen zu jeder foreach-Iteration hinzufügen:

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

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

Dies gibt Folgendes aus:

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

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

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

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

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

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

Sie können deutlich sehen, dass jedes Element von $arr wird auf den Wert von $item gesetzt, der während der zweiten foreach-Schleife zum letzten Element des Arrays wechselt.

Fehler oder beabsichtigtes Verhalten?

Dies Verhalten ist kein Fehler. Es ist eine Folge der Referenzübergabe. Die foreach-Schleife weist einfach den Wert des aktuellen Elements der im Schleifenheader angegebenen Variablen zu. In diesem Fall ändern wir durch die Referenzierung von $item die ursprünglichen Array-Elemente in der zweiten Schleife. Dies entspricht dem folgenden Code:

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

Daher ist das beobachtete Verhalten kein Fehler, sondern ein Ergebnis der beabsichtigten Semantik der Pass-by-Reference in PHP. Um ein solches Verhalten zu vermeiden, verwenden Sie in der zweiten foreach-Schleife die Wertübergabe, indem Sie einfach den Wert jedes Elements $item zuweisen: foreach ($arr as $item).

Das obige ist der detaillierte Inhalt vonWarum wird das letzte Element in der Foreach-Schleife von PHP mit Pass-by-Reference dupliziert?. 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