在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8)
这里有个问题很多人会迷糊。循环结束后,value并未销毁,value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n";
上面代码的运行结果如下:
1,2,3 1,2,3 1,2,2
你猜对了吗?为什么是这个结果呢?
我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:
第一步:复制arr[0]到value(注意此时value是arr[2]的引用),这时数组变成[1,2,1]
第二步:复制arr[1]到value,这时数组变成[1,2,2]
第三步:复制arr[2]到value,这时数组变成[1,2,2]
综上,最终结果就是1,2,2
避免这种错误最好的办法就是在循环后立即用unset函数销毁变量:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3]