PHP for, foreach時 pass by reference 要注意的地方(超難找的問題)



// 先來看看狀況

$arr = array("a", "b", "c");

foreach ($arr as &$item) {}

print_r($arr);

foreach ($arr as $item) {}

print_r($arr);

// output

/*

Array

(

[0] => a

[1] => b

[2] => c

)

Array

(

[0] => a

[1] => b

[2] => b

)

*/

// 第二次的陣列被改變了



// 原因是因為當這行執行完時

foreach ($arr as &$item) {}

// $item 其實是指到$arr[2]的

// 在後來的回圈

foreach ($arr as $item) {}

// 這邊的$item指的是$arr[2]的位址

// foreach的時候會不斷的把$arr的每一個值都放到$item中

// 而$item因為上一個傳址呼叫的原因被指定為$arr[2]

// 所以第二個回圈只是不停的改變$arr[2]



// 解決方法: unset();

$arr = array("a", "b", "c");

foreach ($arr as &$item) {}

print_r($arr);

unset($item);

foreach ($arr as $item) {}

print_r($arr);



// 結論: 如果使用到 pass by reference(傳址呼叫)

// 要記得把那個變數改unset掉,

// 不然誤用到那個變數就不好了。






留言

這個網誌中的熱門文章

成人剪舌繫帶聽過嗎?我剪了!!

Scp - ssh 的遠端檔案傳輸指令

睡覺使你更有效率