PHP的一个小问题。

## 标题文字 ##

为什么会这样?为啥前两个下标没引用,而偏偏最后一个用到了,谁能系统的解释一下以及原理。

阅读 3.2k
4 个回答

因为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一下咯

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题