// 先來看看狀況
$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掉,
// 不然誤用到那個變數就不好了。
留言
張貼留言