PHP Foreach 依引用傳遞和陣列修改
在 PHP 中,在 foreach 迴圈中使用按引用傳遞可能會導致意外行為。考慮以下程式碼:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} // Array remains unchanged: ["foo", "bar", "baz"] foreach ($arr as $item) {} // Array is modified: ["foo", "bar", "bar"]
為什麼第二個循環會修改陣列?
在第一個循環中,$item 變數是透過引用傳遞的。這意味著對 $item 所做的變更也會影響 $arr 陣列中的對應元素。但是,在第二個循環中,$item 是按值傳遞的。因此,對 $item 所做的變更不會影響陣列。
至關重要的是,在第一個循環之後,$item 仍然引用 $arr 的最後一個元素。當第二個迴圈遍歷數組時,$item 的每個值都會覆寫 $arr 的最後一個元素,因為它們都引用相同的記憶體位置。
調試輸出
要理解其行為,我們可以回顯 $item 的當前值,並在每次循環迭代期間遞歸打印 $arr 數組。
第一個循環:
foo Array ( [0] => foo [1] => bar [2] => baz ) bar Array ( [0] => foo [1] => bar [2] => baz ) baz Array ( [0] => foo [1] => bar [2] => baz )
第一次循環後,$item指向$arr的最後一個元素。
第二次循環:
foo Array ( [0] => foo [1] => bar [2] => foo ) bar Array ( [0] => foo [1] => bar [2] => bar ) bar Array ( [0] => foo [1] => bar [2] => bar )
$item的每個值都被覆蓋,它還會修改 $arr 的最後一個元素。
這是一個 Bug 嗎?
不,這種行為不是一個 Bug,而是 pass- 的預期行為透過引用。了解透過引用傳遞變數的含義並正確使用它非常重要。
以上是為什麼在 PHP `foreach` 迴圈中使用參考傳遞會在迴圈結束後修改陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!