猜猜下面的代碼會輸出什麼?
1 2 3 4 5 6 7 8 | <?php $a = array(1=> 'one' , 2=> 'two' ); foreach ($a as $key => &$val) {} // do nothing var_dump($a); foreach ($a as $key => $val) {} // do nothing var_dump($a); |
$a的內容變了
原因
在foreach中使用了引用,&$val,這個值並沒有在第一個foreach退出後自動清空,而是保留在內容中,當進入第二個foreach時,仍然可以訪問到$val。這個值是$a的最後一個元素的引用,所以,在第二個foreach的第一次循環時,將$a[1]的值付給$val,實際上是修改了$a的最後一個值。
第二次循環時,$val已經不是引用了,所以值再保持不變。
解決方案
第一次循環退出後,unset這個臨時變量$val,如下代碼所示:
1 2 3 4 5 6 7 8 9 | <?php $a = array(1=> 'one' , 2=> 'two' ); foreach ($a as $key => &$val) {} // do nothing unset ($val); // important! var_dump($a); foreach ($a as $key => $val) {} // do nothing var_dump($a); |
正常了