注意如下一段代码:

$data1 = ["1","2","3"];
$data2 = ["4","5","6"];
$all = 0;
foreach($data1 as &$x){
   $all += $x;
}
#注意这里$x是$data1最后一个元素的引用, 即 $data1[2] = $x,因此$x的值修改就是$data1[2]的值的修改;$all2 = 0;
foreach($data2 as $x=>$y){
    $all2 += ($y+$data1[$x]); //原意是计算:1+4 + 2+5 + 3+6 的总和,结果应该是21;但是$x=2的时候,$data1[2]=$x=2,最后是2+6,最终的值是20
}
echo all2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
结果输出:20
  • 1

为什么? 
因为第一个foreach运行完后,$x是$data1[2]的引用,所以:

由于第二个foreach循环,$data1[2]在不经意间,经历了0->1->2的变化。
  • 1

因此,平时在使用完“引用foreach”,可以看情况加上:

unset($x);
所有评论
加载评论 ...
发表评论