close
在foreach中, 可以使用 &$val 對陣列進行參照, 但若不謹慎操作很容易造成接下來的陷阱產生 先來看一個簡單的例子:
$data = [1,2,3]; foreach ($data as &$v) { echo $v; //1,2,3 } foreach ($data as $v) { echo $v; //1,2,2 }
第一個陣列印出1,2,3 嗯 正常
預期中第二個陣列應該也是 1,2,3 但結果卻是 1,2,2
為什麼呢?
因為在第一個foreach中, $v被設定使用參照(&), 所以當第一次迴圈結束時, $v為$data[2] 的參照
所以在第二次迴圈進行時, 每一次 $data => $a 的賦值, 都會動態地改變 $data[2]的值:
//第一個迴圈 $v = $data[0]; //印出1 ,且$v被設為參照$data[0] $v = $data[1]; //印出2 ,且$v被設為參照$data[1] $v = $data[2]; //印出3 ,且$v被設為參照$data[2]****** 很重要, 因為現在$v的參照停在這邊 //第二個迴圈 $data[2] = $v = $data[0], echo $v; // $data[0] 對$v賦值, 所以印出 1, 並同時因為參照的關係對$data[2]賦值 $data[2] = $v = $data[1], echo $v; // $data[1] 對$v賦值, 所以印出 2, 並同時因為參照的關係對$data[2]賦值 $data[2] = $v = $data[2], echo $v; // $data[2] 對$v賦值, 因為在上一行$data[2]已被$data[1]賦值, 所以這邊印出 2, 並同時因為參照的關係對$data[2]賦值
此時在印出$data[2]的值, 會發現已經變成 [1,2,2] 了!
另外要注意的是, 使用&參照, 要避免汙染之後程式的問題, 一定要在結束後使用
unset($v);
將$v釋放掉, 才不會影響變數使用。
來源:
http://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach
文章標籤
全站熱搜
留言列表