本文目的
今天在寫項目時,發現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);
輸出結果如下:
參考資料