PHP:将在一个数组上使用array_splice;s foreach()的主题会引起问题


PHP: Will using array_splice on an array that's the subject of a foreach() cause problems?

我正在写一些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)
        }
    }

它应该搜索被拒绝值的列表(filter[1]),找到是否存在替换,然后(如果存在)将替换添加到好值列表(filter[0]),同时从拒绝列表中删除固定值。

从foreach()的主要主题数组中删除值会导致此问题吗?

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

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

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

简洁地回答这个问题:不。

原因是foreach使用数组的副本,具有写时复制行为——只要修改主题数组,就会生成副本,因此不会影响循环。因为array_splice()不依赖于数组内部指针的当前位置,所以使用它是安全的。而current()则不然。

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