PHP 面试题foreach遇到的坑(注意事项)

php中foreach指针注意事项

$array = array(1,2,3,4,6,9);
foreach ($array as &$value) {}
foreach ($array as $value) {}
echo implode(',', $array);
2.png

拆分对比理解


    $speed = array(1,2,3,4,6,9);
    foreach($speed as &$value){}
    foreach($speed as &$value){}
    echo implode(',', $speed);
    echo "<br>";

    $array = array(1,2,3,4,6,9);
    foreach ($array as &$value) {
        print_r($array);
        echo "<br>";
    }
    echo "<br>";
    echo implode(',', $array);
    echo "<br>";
    foreach ($array as $value) {
        print_r($array);
        echo "<br>";        
    }
    echo implode(',', $array);
1.jpg

在执行第一个使用引用的 foreach 时, 一开始, $value 指向 $array[0] 的存储空间(地址),空间内存储着 1 , 一直到foreach 结束时, $value 指向 $array[5] (最后的地址)的存储空间,空间内存储着 9 。

下面要开始执行第二个 foreach 了,注意和第一个 foreach 不同, 第二个 foreach 没有使用引用,那么就是赋值方式, 即将 $array 的值依次 赋值 给 $value。 进行到第一个元素时,要将$array[0] 赋值给 $value 。 问题就在这里,由于刚刚执行完第一个 foreach, $value 不是一个新变量,而是已经存在的、指向 $array[5] (最后的地址)的存储空间, 如此一来,对 $value进行赋值的时候,** 就将 $array[0] = 1 写入了 $array[5] 的实际存储空间 ,(如上图第一次循环key值5的变量为1)相当于对 $array[5] 进行赋值。而此时的$array数组也变成[1,2,3,4,6,1]**依此类推,第二个 foreach 执行到第5次时,数组则为[1,2,3,4,6,6]在第六次对 $array[5] 的实际存储空间进行重写时,此时从上一次数组[1,2,3,4,6,6]找到的$array[5] 中的值是6(已经被上一次的$array[4]重写成6),所以找到的$array[5] 的存储空间的值是6,所以数组遍历到最后就是[1,2,3,4,6,6]。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容