php数组遍历引用

$a=[1,2,3];
foreach($a as &$v){
    $v*=2;
}
foreach($a as $v){
}
var_dump($a);
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  &int(4)
}

解释:

第一个循环完成之后别名$v指向了数组的最后一个元素等价于:

$v=6;
$a[2]=&v;

第二个循环一共有三次,每一次都给$v进行赋值操作,也就是每次都给$a[2]进行赋值操作,第一次循环的时候$a[2]=2,第二次循环$a[2]=4,第三次循环相当于把$a[2]的值赋给$a[2],所以还是4。

所以别名(引用)用完之后要记得unset掉,正确代码如下:

$a=[1,2,3];
foreach($a as &$v){
    $v*=2;
}
unset($v);
foreach($a as $v){
}
var_dump($a);