PHP的foreach在用&引用时,如果再遇到同名的as变量,会改写原数组最后的元素

1910阅读 0评论2016-07-18 lsstarboy
分类:PHP

现象:
  直接看代码:      

  1. <?php
  2.   $content = array(
  3.           array('image'=>'a.jpg'),
  4.           array('image'=>'b.jpg'),
  5.           array('image'=>'c.jpg')
  6.   );
  7.   if( is_array( $content )){
  8.           foreach( $content as &$v ){
  9.                   $v['sort'] = 1;
  10.           }
  11.   }

  12.   $arr = array(
  13.           's1'=>1,
  14.           's2'=>2,
  15.           's3'=>3
  16.   );

  17.   $arr2 = array();
  18.   foreach( $arr as $v ){
  19.           $arr2[] = $v;
  20.   }

  21.   var_dump( $content, $arr2 );

  22.   ?>
  说明:1、本例意图:先定义一个content,然后为content的每一个元素添加一个sort项。
                2、在写代码时,因为结构比较简单,直接使用了默认的&$v作为as的子句。
     3、后来又使用了一次foreach,同样使用了$v。
     4、结果……就出错了。

思考:你认为content[3]的结果是什么?
结果:注意红字部分。

  1. array(3) {
  2. [0]=>
  3. array(2) {
  4. ["image"]=>
  5. string(5) "a.jpg"
  6. ["sort"]=>
  7. int(1)
  8. }
  9. [1]=>
  10. array(2) {
  11. ["image"]=>
  12. string(5) "b.jpg"
  13. ["sort"]=>
  14. int(1)
  15. }
  16. [2]=>
  17. &int(3)
  18. }
  19. array(3) {
  20. [0]=>
  21. int(1)
  22. [1]=>
  23. int(2)
  24. [2]=>
  25. int(3)
  26. }

结论:

  如果使用了foreach的元素引用符&,一定要注意本次循环结束后,仍然维持了最后一次对$v的关系。





--- end ---

上一篇:webuploader放入bootstap的tab-content时,不能正确初始化
下一篇:FreeBSD 下pkg出现size mismatch错误