Heim >Backend-Entwicklung >PHP-Tutorial >foreach 传引用的时候有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?
$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>