这道经典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/... 来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

请问为什么是这样呢?

阅读 5.8k
评论 2017-02-07 提问
    7 个回答

    foreach的问题,参考:
    http://php.net/manual/en/cont...

    标准的写法:在使用了“ & ”的 foreach 之后,需要写一句 unset($v); 释放掉临时的引用。

    该题的两个foreach的代码效果类似于以下代码:

    $v = &$arr[0];
    $v = &$arr[1];
    $v = &$arr[2];
    //var_dump($arr);
    
    //请注意,从这个时候开始,$v和$arr[2]是等价的
    
    $v = $arr[0];
    $v = $arr[1];
    $v = $arr[2];
    //var_dump($arr);
    

    这个面试题应该就是考察PHP的代码规范了,毕竟这种细节很容易被忽略,有时候确实会导致问题。

    评论 赞赏 2019-03-23