这道经典PHP面试题有点不懂

<?php
   //第2题:
    $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),你的答案对了吗?为什么
?>

作者:舒铭 链接:https://zhuanlan.zhihu.com/p/... 来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

请问为什么是这样呢?

阅读 6.7k
评论
    7 个回答
    • 5.1k

    这个问题我在本站曾多次回答,如果你曾百度就能解决,没必要发布一个问题的。
    这个问题的根本原因在于
    php是没有块级作用域的!!

    答案

    php是没有块级作用域的!!!
    也就是说,第一个循环结束后,$item依然指向数组的第三个成员。
    之后每次循环,就把数组的第一个值写到第三个成员,然后是第二个值写个第三个成员,然后是第三个值写到第三个成员,但此时第三个值已经被上次修改成2了,所以这次第三个值会被修改成2.

    证明

    这里。我们将这个代码修改一下,加点调试信息

    $a = array(1,2,3);
    foreach($a as &$item){
        echo $item . ',';
    }
    var_dump($a);
    foreach($a as $item){
        var_dump($a);
        echo $item . ',';
    }

    上述程序输出结果为

    1,2,3,array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      &int(3)
    }
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      &int(1)
    }
    1,array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      &int(2)
    }
    2,array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      &int(2)
    }
    2,

    你看明白了吗?

      相似问题
      推荐文章