扫码关注官方订阅号
为什么会这样?为啥前两个下标没引用,而偏偏最后一个用到了,谁能系统的解释一下以及原理。
ringa_lee
因为foreach完成之后,最后的$a依然是引用的$array[2],但最后执行了$a=0,这里就相当于$array[2]=0(原来应该是$array[2]=9),所以最后的结果是
foreach
$a
$array[2]
$a=0
$array[2]=0
$array[2]=9
[1, 4, 0]
指针相互影响的原因, 貌似PHP7已经解决了该问题..
PHP5: • $a = array(1,2,3); foreach($a as $v) { var_dump(current($a)) } int(2) int(2) int(2) • $a = array(1,2,3); $b=&$a; foreach($a as $v) { var_dump(current($a))} int(2) int(3) bool(false) • $a = array(1,2,3); $b=$a; foreach($a as $v) { var_dump(current($a))} int(1) int(1) int(1)
PHP7: Doesn’t use/modify array internal pointer anymore • $a = array(1,2,3); foreach($a as $v) { var_dump(current($a)) } int(1) int(1) int(1) • $a = array(1,2,3); $b=&$a; foreach($a as $v) { var_dump(current($a))} int(1) int(1) int(1) • $a = array(1,2,3); $b=$a; foreach($a as $v) { var_dump(current($a))} int(1) int(1) int(1)
摘至鸟哥
弄明白引用与传值的区别,这个问题也就明白了。 在foreach中$a指的就是$array中的元素,通过循环先指向$array[0],然后是$array[1]...,你可以理解为$array中的元素在循环过程中多了一个$a标签,它们是指向同一个值(物理地址)的。所以在foreach中,$array的元素都被引用了,$a = $a这个运算结果反应在$array数组中。 其中当循环到第三次的时候,通过$a=$a运算,$array[2]的值变为了9,循环结束,但是这是$a还是$array[2]的引用,并没有注销,这是将$a赋值为0,所以$array[2]就变成了0. 所以最终结果就是[1,4,0];
这问题前几天面试的时候正好遇到了,因为下面使用的$a还没有被释放掉,还是$array数组中的引用。所以一般使用foreach的引用传值时最好在后面unset一下咯
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
因为
foreach
完成之后,最后的$a
依然是引用的$array[2]
,但最后执行了$a=0
,这里就相当于$array[2]=0
(原来应该是$array[2]=9
),所以最后的结果是指针相互影响的原因, 貌似PHP7已经解决了该问题..
摘至鸟哥
弄明白引用与传值的区别,这个问题也就明白了。
在foreach中$a指的就是$array中的元素,通过循环先指向$array[0],然后是$array[1]...,你可以理解为$array中的元素在循环过程中多了一个$a标签,它们是指向同一个值(物理地址)的。所以在foreach中,$array的元素都被引用了,$a = $a这个运算结果反应在$array数组中。
其中当循环到第三次的时候,通过$a=$a运算,$array[2]的值变为了9,循环结束,但是这是$a还是$array[2]的引用,并没有注销,这是将$a赋值为0,所以$array[2]就变成了0.
所以最终结果就是[1,4,0];
这问题前几天面试的时候正好遇到了,因为下面使用的$a还没有被释放掉,还是$array数组中的引用。所以一般使用foreach的引用传值时最好在后面unset一下咯