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

http://rocksaying.tw/archives/3669955.html

arrow
arrow
    文章標籤
    PHP foreach reference
    全站熱搜

    CccKaAsS 發表在 痞客邦 留言(0) 人氣()