本文目的
今天在寫項目時,發現php foreach語句中使用引用會出現奇特現象,故此記錄此現象,原因和解決方法。希望對其他人有幫助!
現象
猜猜下面的代碼會輸出什么?
<?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);
如果沒有遇到過類似的問題,肯定會對結果大驚!如下圖

我勒個去,怎么修改了數組,代碼中沒有任何顯示修改數組的操作呀!
原因
在foreach中使用了引用,&$val,這個值並沒有在第一個foreach退出后自動清空,而是保留在內容中,當進入第二個foreach時,仍然可以訪問到$val。所以,在第二個foreach的第一次循環時,實際上已經修改了$a[1]的值。第二次循環時,值保持不變。
解決方案
第一次循環退出后,unset這個臨時變量$val,如下代碼所示:
<?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);
輸出結果如下:

參考資料
