php的foreach与引用(&)一起,如果使用不当,会引起相当隐蔽的bug。

  $arr = array(1,2,3);
  foreach($arr as &$a){
      echo $a."\t";
  }
  echo "\n";

  foreach($arr as $a){
      echo $a."\t";
  }

输出为:

:!./test.php
1       2       3
1       2       2
而期望输出为:
:!./test.php
1       2       3
1       2       3

可以看到,数组的最后一个元素被修改了!

实际上,是数组的最后一个元素,被N次改写了。具体过程为:

  1. 第一次foreach结束之后,$a与$arr[last]指向同一块地址
  2. 第二次foreach里,每次,$a的内容都被改写!
    1. $arr[2] = $a = $arr[0] = 1
    2. $arr[2] =  $a = $arr[1] = 2
    3. $arr[2] =  $a = $arr[2] = 2

这样就很明显了!通过以下代码可以看出具体过程:

 $arr = array(1,2,3);
  foreach($arr as &$a){
      echo $a."\t";
  }
  echo "\n";

  foreach($arr as $a){
      echo "$a( $arr[2] )\t";
  }

输出为:

:!./test.php
1       2       3
1( 1 )  2( 2 )  2( 2 )

Leave a Reply