>백엔드 개발 >PHP 튜토리얼 >foreach 传引用的时候有bug?

foreach 传引用的时候有bug?

WBOY
WBOY원래의
2016-06-06 20:31:221111검색

$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으로 문의하세요.