簡介:
你是否遇過一個奇怪的現象,最後一個使用帶有引用傳遞的foreach 進行迭代後,PHP 數組的元素出現重複?這種令人費解的行為通常會引發有關潛在錯誤或奇怪的系統行為的問題。
理解行為:
理解這一點的關鍵是按引用傳遞的本質在 PHP 的 foreach 循環中。當參數中使用“&”時,直接修改對陣列元素的引用,而不是複製。這意味著對循環中傳遞的變數所做的任何更改都會直接影響原始數組。
問題中的錯誤:
在提供的範例中:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} foreach ($arr as $item) {}
第一個 foreach 迴圈建立對陣列元素的參考。由於 $item 現在是一個引用,因此在循環內修改它也會更改對應的陣列元素。
但是,第二個 foreach 迴圈不會建立參考。這表示當迴圈為 $item 指派新值時,只會影響本機副本,不會更新原始陣列。
複製效果:
現在,讓我們考慮 $item 是對最後一個陣列元素(即「baz」)的引用的情況。由於第一個循環建立了該參考,因此第二個循環也使用相同的參考。因此,在第二個循環中分配給 $item 的任何值都會直接傳遞給 $arr[2]。
因此,當第二個循環將 'bar' 分配給 $item 時,它會無意中替換最後一個元素數組中帶有“bar”,導致明顯的重複。
預期與實際輸出:
循環之前:["foo", "bar", "baz"]
第一個循環之後(參考):["foo", "bar" , "foo"] (因為$item 仍然引用$arr[2])
第二個循環之後(非引用): ["foo", "bar", "bar"]
這是一個錯誤嗎?
不,這種行為不是一個錯誤。這只是在 PHP 的 foreach 迴圈中使用引用的預期結果。 $item 的值是對原始數組元素的引用,每當修改時都會影響底層數組。
以上是為什麼在使用 foreach 和引用傳遞後,PHP 陣列的最後一個元素出現重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!