首页 >后端开发 >php教程 >foreach 传引用的时候有bug?

foreach 传引用的时候有bug?

WBOY
WBOY原创
2016-06-06 20:31:221102浏览

$a = array(1,2,3);
var_dump($a);
foreach($a as &$b){}
var_dump($a);
foreach($a as $b){
var_dump($b);
}

下面是5.2到7.0的结果

array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(3) }
int(1) int(2) int(2)

早期版本的输出请看http://3v4l.org/PXsWr

请问这是不是php的一个bug?

回复内容:

$a = array(1,2,3);
var_dump($a);
foreach($a as &$b){}
var_dump($a);
foreach($a as $b){
var_dump($b);
}

下面是5.2到7.0的结果

array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(3) }
int(1) int(2) int(2)

早期版本的输出请看http://3v4l.org/PXsWr

请问这是不是php的一个bug?

提问之前 难道不应该先搜索一下的嘛....参考 foreach 指针

产生这个现象的原因是因为,两次foreach都用了$b,而foreach的过程是先进行赋值,所以在第二次循环的第一步,会把数组的第一项复制给指向最后一项的指针,因此导致了数组的最后一项改变了

$b在第二个foreach的时候,还是相当于&$a[2],所以惨剧发生了 -- $a[2]被修改了

这就是偶不喜欢使用foreach,而喜欢使用array_walk的原因:

<code>$a = array(1,2,3);
var_dump($a);
array_walk($a, function(&$b){
   // do something
});
var_dump($a);
array_walk($a, function($b){
    var_dump($b);    // => int(1) int(2) int(3)
});
</code>
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn