小心使用foreach语法

小心使用foreach语法

Chris Yue One comment
Posts

虽然foreach给遍历数组带来了很多方便,但如果不小心使用很可能出现意想不到的问题,问题基本上都跟引用赋值(assigning reference)有关系。下面列出一些常见的示例。

删除元素

$foo = array(1, 2, 3);
foreach ($foo as &$bar) {
    if ($bar === 2) {
        unset($bar); // 这样不会将值为2的元素从数组里面去掉
    }
}

要想去掉数组里面的某一个值必须使用unset($foo[$key])的方式
这算是一个比较低级的失误,unset只能删除$bar这个临时变量而已

两次遍历

$foo = array(1, 2, 3);
foreach ($foo as &$bar) {}
var_dump($foo); // 很奇怪最后一个元素是&int(3),而其他的都没有&标识
foreach ($foo as $bar) {}
var_dump($foo); // 更奇怪是这里最后一个元素变成了&int(2)

这个结果很诡异,不知道算不算是一个bug

内存溢出

在官方手册上的foreach部分,有一个警告是说:如果使用引用赋值,那么最后一个元素的赋值在foreach结构之后,最后一个元素的引用将不能被自动释放,建议你自己在最后一个loop之前把引用unset掉。但是实际操作起来略嫌麻烦。

对于跟我一样粗心的人来说,使用foreach最保险还是老老实实用$key => $val

小心使用foreach语法 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人

One comment

eirc

四月 30, 2011 在 8:28 下午

没错,要小心

发表评论

13 − = 5