本文目的
今天在寫專案時,發現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);
參考資料
foreach中使用引用傳參造成的錯誤
同事寫的 上傳資料的時候,總是會最後一條資料被上一條資料覆蓋掉,導致倒數第二條資料出現兩次,最後一條資料丟失 經排查,是對同一資料進行多次foreach時,有時用的引用傳參,有時沒有用引用傳參造成的,復現問題如下 test array array one 小明 two 小張 three 小剛 for...
PHP中使用foreach時加 符號的用法
foreach時加 符號 遍歷的同時改變原陣列即修改資料或者增加資料。arr a b c foreach arr as key value echo json encode arr a111 b111 c111 這裡改變了原來陣列的值使用 可能出現的問題 arr a b c foreach arr ...
PHP中使用foreach時加 符號的用法
foreach時加 符號 遍歷的同時改變原陣列即修改資料或者增加資料。arr a b c foreach arr as key value echo json encode arr a111 b111 c111 這裡改變了原來陣列的值使用 可能出現的問題 arr a b c foreach arr ...