我來過的情況下,foreach中的值通過引用傳遞以修改元素,然後在代碼的稍後階段,相同的數組再循環做一些計算,但這次元素是按值傳遞的。問題在於PHP在第一個foreach中保留了對數組中最後一個元素的引用,然後將在下一個foreach開始時覆蓋該元素,如果本地變量具有相同的名稱。替代foreach通過引用
示例代碼:
<?php
$a = array("a" => "foo");
$b = array("b" => "bar");
$x = array($a, $b);
foreach ($x as &$y) {}
print_r($x);
foreach ($x as $y) {}
print_r($x);
?>
這將產生
Array ( [0] => Array ( [a] => foo ) [1] => Array ( [b] => bar ) ) Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo ) )
這荒謬PHP手冊
警告一個$值的參考和最後陣列被表示元素在foreach循環之後仍然存在。建議通過unset()銷燬它。
事實上,使用unset($y)
將解決此問題。但是這是非常脆弱的,你不能依賴於編程人員總是記住取消設置一個範圍不明顯的變量。所以我的問題是:是否有任何foreach的好替代方案 - 通過引用來消除以後需要取消設置變量?
你給不給上爲什麼它是必要的任何線索的例子在這裏使用參考。 – raina77ow 2014-10-28 11:03:45
'$ a = array(「a」=>「foo」); $ b = array(「b」=>「bar」); $ x = array($ a,$ b);'你確定你不想使用'array_merge();'? – 2014-10-28 11:04:36
@ raina77ow這真的很重要嗎?代碼只是指出了缺陷。所有你需要知道的是變量需要修改。 – jurgemaister 2014-10-28 11:05:55