这道经典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.4k
评论
    7 个回答

    原因就是在第一次遍历时用的是&val引用赋值,而在foreach完之后,这个$val依然存在,是$arr[2]元素的引用
    当进入到第二次遍历时,在遍历到第一个元素时$val被赋值为1,相当于

    $arr[2] = 1;

    遍历到第二个元素时

    $arr[2] = 2;

    遍历到第三个元素时

    $arr[2] = $arr[2]

    所以最后的结果就成了1,2,2。