$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
$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
参考 https://www.cnblogs.com/eleve...
陷阱:两次循环使用同样的临时变量的情况下,如果第一次循环使用的是引用,
那么在第二次循环中即使没有加&符号,临时变量也是引用。这个引用指向了数组中最后一个元素(循环到了最后一个元素结束)。
如何避免这个问题?
1、在第二次循环之前,unset($value)
2、第二次foreach的时候使用不同名字的变量,如$item
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答805 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
1 回答703 阅读✓ 已解决
这个挺有意思的,很简单,我们来分析一下执行流程即可。
首先,第一次是
第一次是引用遍历形式,而在PHP中,foreach里的变量不是只在foreach这个范围内有效,而是在整个下文程序中都是有效的。
所以,第一次遍历,此时
$v
得到的是$a
数组最后的一个引用,也就是$v == $a[2] == 3
,当前$v是$a[2]的引用。然后来看第二次
我们来看这里的执行情况,这里执行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]
;如果是多次循环,可以依此道理进行计算。