首頁  >  文章  >  後端開發  >  為什麼使用引用傳遞的 PHP foreach 迴圈會意外更改我的陣列?

為什麼使用引用傳遞的 PHP foreach 迴圈會意外更改我的陣列?

Barbara Streisand
Barbara Streisand原創
2024-11-13 10:54:02501瀏覽

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

PHP Foreach 透過引用傳遞:最後一個元素重複? (錯誤?)

理解問題

考慮以下 PHP代碼:

$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"]

第一個循環之後,數組按預期打印:

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

但是,在第二次循環之後,數組意外更改:

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

說明

問題出現此問題是因為第一個foreach循環透過引用傳遞 $item。這意味著 $item 是 $arr 陣列中元素的別名。在第一個循環中,未對 $item 或 $arr 進行任何更改。

但是,第二個循環以值傳遞 $item。當迴圈中給予 $item 的值新值時,$arr 中對應的元素也會被修改。

具體來說,$arr 的第三個元素(“baz”)被替換為第二個循環的最後一次迭代期間的第二個元素(“bar”)。這解釋了為什麼 $arr 的最後一個元素在第二次循環後重複。

這是一個錯誤嗎?

不,這種行為不是一個錯誤。這是 foreach 迴圈在透過引用傳遞變數時的預期行為。請務必注意此行為,以避免陣列發生意外變更。

偵錯輸出

為了幫助視覺化該行為,以下程式碼新增了echo 語句在每次循環迭代後列印$item 和陣列$arr 的值:

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

輸出示範了$item 和$arr 在循環期間如何變化,清楚地說明了上述行為。

以上是為什麼使用引用傳遞的 PHP foreach 迴圈會意外更改我的陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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