php数组引用的小疑问

$a=[1,2,3]; 
foreach($a as &$v){} 
foreach($a as $v){}

var_dump($a);

//结果
0 => int 1
1 => int 2
2 => int 2

为什么最后一个元素变成了2

阅读 1k
评论
    3 个回答
    • 5.1k

    这个挺有意思的,很简单,我们来分析一下执行流程即可。

    首先,第一次是

    foreach($a as $v) {}

    第一次是引用遍历形式,而在PHP中,foreach里的变量不是只在foreach这个范围内有效,而是在整个下文程序中都是有效的。

    所以,第一次遍历,此时$v得到的是$a数组最后的一个引用,也就是 $v == $a[2] == 3,当前$v是$a[2]的引用。

    然后来看第二次

    foreach($a as $v) {}

    我们来看这里的执行情况,这里执行3次,我们从第一次到第三次的执行分析。

    首先第一次foreach后,$v = $a[0] == 1,也就是$v被赋值为$a[0],而从上文我们知道$v是$a[2]的引用,所以,此时相当于$a[2] = $v = $a[0] == 1,也就是说,此时$a = [1,2,1]

    同理,来看第二次foreach,此时从第一次循环所看到的$a = [1,2,1]可知$v = $a[1] == 2,已知$v是$a[2]的引用,所以此时相当于$a[2] = $v = $a[1] == 2,也就是说,此时$a = [1,2,2];

    由此可见,第三次循环,那么$v = $a[2],而从第二次循环可知$a = [1,2,2],所以此时$v == 2,已知$v是$a[2]的引用,所以此时相当于$a[2] = $v = $a[2] == 2,也就是说,此时$a = [1,2,2]

    如果是多次循环,可以依此道理进行计算。

      相似问题
      推荐文章