foreach语句在使用的时候,如果需要改变元素的值,可以将其赋予另一个数组,也可以使用传值引用:
foreach($arr as $key=>&$value){
..
{
上面的语句相当于循环的传值引用:
$value=&$arr[$key]
foreach循环结束后,最后一个$value将会被保留,即$value会保持与$arr最后一个元素建立的传值引用关系.
如果接下来重启一个foreach循环,且还是用$value来赋值的话,$value被赋值的同时,由于存在传值引用,之前的数组的最后一个元素也会被改变
下面是一个在PHP手册上的例子
<?php
$arr1 = array("a" => 1, "b" => 2, "c" => 3);
$arr2 = array("x" => 4, "y" => 5, "z" => 6);
foreach ($arr1 as $key => &$val) {}
foreach ($arr2 as $key => $val) {}
var_dump($arr1);
var_dump($arr2);
?>
The output is:
array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> &int(6) }
array(3) { ["x"]=> int(4) ["y"]=> int(5) ["z"]=> int(6) }
上面的例子中,由于$value=&$arr1['c']关系的存在,在将$arr2的每个元素赋值给$value的过程中,$arr1['c']的值都会改变,最终值为6
解决上述问题的方法就是在完成循环之后删除$value变量:unset($value)