首頁 >後端開發 >php教程 >為什麼 PHP 的 Foreach 迴圈中的最後一個元素會透過引用傳遞而重複?

為什麼 PHP 的 Foreach 迴圈中的最後一個元素會透過引用傳遞而重複?

Linda Hamilton
Linda Hamilton原創
2024-11-16 19:08:02850瀏覽

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

PHP Foreach 透過引用傳遞謎題:神秘的最後一個元素重複

在PHP 中,當您使用帶有pass-by的foreach 迴圈時,引用分配(例如,foreach ($arr as &$item)),可能會出現意外行為。考慮這個令人困惑的例子:

$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

此程式碼輸出:

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

解釋重複

第一個foreach 循環之後,每個元素$arr 仍然被$item 引用。當第二個循環迭代時,它用 $item 的值替換每個元素的值,$item 恰好是數組的最後一個元素。這意味著 $arr 的每個元素都設定為 $arr[2] 的值,導致輸出中最後一個元素重複。

調試輸出

為了說明此行為,讓我們透過向每個foreach 迭代添加print 語句來調試輸出:

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

This輸出:

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 )

您可以清楚地看到$arr 的每個元素都設定為$item 的值,該值在第二個foreach 循環期間更改為數組的最後一個元素。

錯誤還是預期行為?

此行為不是錯誤。這是透過引用傳遞的結果。 foreach 迴圈只是將目前元素的值指派給迴圈頭中指定的變數。在本例中,透過引用 $item,我們在第二個循環中修改原始陣列元素。這相當於以下程式碼:

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

因此,觀察到的行為不是錯誤,而是 PHP 中按引用傳遞的預期語義的結果。為了避免這種行為,請在第二個 foreach 迴圈中使用按值傳遞,只需將每個元素的值分配給 $item:foreach ($arr as $item)。

以上是為什麼 PHP 的 Foreach 迴圈中的最後一個元素會透過引用傳遞而重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn