来看一段代码
$arr = [1, 2, 3]; foreach ($arr as $k=>&$v) { $v = $v * 2; } foreach($arr as $v) { echo $v,"\n"; }
请迅速给出结果,看看和正确答案是否一致。
正确答案是:
2 4 4
这里面的一个关键点就是,第一个循环进行完后,$v和数组有如下关系:
$arr[2] = &$v;
进行第二个循环的时候,第一次运行相当于:
$v = $arr[0]; //由于$v和$arr[2]有引用关系,所以: $arr[2] = $arr[0]
第二次运行相当于:
$v = $arr[1]; //由于$v和$arr[2]有引用关系,所以: $arr[2] = $arr[1]
最后输出$arr[2]的值,等同于$arr[1]的值。
如何避免这种情况呢:
1、不使用引用
2、循环结束后,执行unset($v)