注意如下一段代码:

$data1 = ["1","2","3"];
$data2 = ["4","5","6"];
$all = 0;
foreach($data1 as &$x){
   $all += $x
}
#注意这里$x是$data1最后一个元素的引用
$all2 = 0;
foreach($data2 as $x=>$y){
    $all2 += ($y+$data1[$x]); //原意是计算:1+4 + 2+5 + 3+6 的总和,结果应该是21
}
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);

$arr=[1,2,3,4];
    foreach ($arr as &$val) {
       echo $val;
    }
    // 1,2,3,4
    unset($val);
    foreach ($arr as $val) {
        echo $val;
    } 
    //1,2,3,4
    
第一次循环后 $val = $arr[3] ;   
第二次循环:
$arr[3] = $val = $arr[0]; //1
$arr[3] = $val = $arr[1]; //2
$arr[3] = $val = $arr[2]; //3
$arr[3] = $val = $arr[3]; //3    $arr[3]赋值成3了

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐