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中文網其他相關文章!