1. 程式人生 > >php的循環與引用的一個坑

php的循環與引用的一個坑

clas it is var 輸出 導致 數組 代碼 troy 指針

以下代碼運行結果出人意料:

$arr = array(
‘a‘=> ‘a11‘,
‘b‘=> ‘b22‘,
‘c‘=> ‘c33‘,
);
foreach ($arr as $k=>&$v){
// Do somethind
}
foreach ($arr as $k=>$v){
var_dump($v);
}

代碼輸出為:

string(3) "a11"
string(3) "b22"
string(3) "b22"

結果裏, 第三行變成了 key=‘b‘ 的value. 問題就出在第一個循環的引用.

今天就踩到了一個這樣的坑, 查問題用了很久. 簡單來說, foreach循環使用的引用, 循環結束後有所保留. php.net 著重寫了:

Warning

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

對於上面這個例子, 第一個循環結束後, $v引用仍然存在.同時,遍歷數組時,改變了數組的值,數組遍歷完成後,數組的指針指向了第二個元素,所以會導致第一次循環結束,c的值被改為b的值

php的循環與引用的一個坑