算法 - PHP的一个小问题。
程序员文章站
2022-06-05 16:18:07
...
为什么会这样?为啥前两个下标没引用,而偏偏最后一个用到了,谁能系统的解释一下以及原理。
回复内容:
为什么会这样?为啥前两个下标没引用,而偏偏最后一个用到了,谁能系统的解释一下以及原理。
因为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一下咯