PHP中使用foreach引用需要注意的問題

2022-04-09 04:29:58 字數 957 閱讀 3265

本文目的

今天在寫專案時,發現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 ...