$arr = [1,2,3]; foreach($arr as &$v) { //nothing todo. } foreach($arr as $v) { //nothing todo. } var_export($arr); //output:array(0=>1,1=>2,2=>2)
由于传引用的原因, 第一个foreach 结束后, 变量$v 指向 $arr[2] 的地址
由于foreach 不存在 块级作用域, 因此 第一个 foreach 结束后, 变量$v 依然存在(切指向$arr[2]的内存地址)
因此, 在第二个foreach中:
第一次循环:
$arr[2] = $v = $arr[0];
第二次循环:
$arr[2] = $v = $arr[1];
第三次循环:
$arr[2] = $v = $arr[2]; // 即 $arr[2] = $arr[2] ; 由于第二次循环中 $arr[2] 被赋值 $arr[1] 即 2, 因此 $arr[2] = 2
为避免 此类问题对程序带来的影响, 应当 在 传引用 循环结束后, 使用:
unset($v);
1