php - foreach 传引用的时候有bug?
黄舟
黄舟 2017-04-10 15:48:00
[PHP讨论组]

$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?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
ringa_lee

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

PHPz

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

黄舟

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

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

$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)
});
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号