3

我正在编写一些类似于这样的 PHP 代码:

foreach($filter[1] as $reject){
        $reject_processed = preg_replace('~\s~','',strtolower($filter[1][$reject]));
        if(array_key_exists($reject_processed,$list_of_common_replacements)){
            $filter[0][] = $list_of_common_replacements[$reject_processed];
            $filter[1] = array_splice($filter[1],$reject,1)
        }

    }

它应该搜索拒绝值列表(过滤器 [1]),查找是否存在替换,然后(如果存在)将替换添加到好值列表(过滤器 [0]),同时从拒绝名单。

在 foreach() 内部从作为 foreach() 的主要主题的数组中删除值会导致问题吗?

4

2 回答 2

6

否。foreach创建数组的副本。考虑以下代码:

$arr = array(1,2,3,4,5);
foreach($arr as $k=>$v) {
    if($v==1) {
        unset($arr);
    }
    echo $v;
}

即使我们在第一次迭代中取消设置整个原始数组,它仍然会打印12345

于 2012-07-20T22:56:13.827 回答
1

简洁地回答这个问题:没有。

这样做的原因是它foreach适用于数组的副本,具有写入时复制的行为 - 只要您修改主题数组,就会生成一个副本,因此它不会影响循环。因为array_splice()不依赖数组内部指针的当前位置,所以使用起来是安全的。current(),另一方面,不是。

我已经深入研究了这个主题,非常困惑,并在 SO 上提出了一个问题,它很好地回答了我的困惑,并完整地解释了它是如何在下面工作的——可以在这里找到。

于 2012-07-20T22:53:17.977 回答