【问题标题】:PHP: Will using array_splice on an array that's the subject of a foreach() cause problems?PHP:在作为 foreach() 主题的数组上使用 array_splice 会导致问题吗?
【发布时间】:2012-07-20 05:37:47
【问题描述】:

我正在编写一些类似这样的 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() 的主要主题的数组中删除值会导致问题吗?

【问题讨论】:

    标签: php foreach array-splice


    【解决方案1】:

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

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

    我已经深入研究了这个主题,非常困惑,并提出了一个关于 SO 的问题,它很好地回答了我的困惑,并完整解释了它是如何运作的 - 可以找到 here

    【讨论】:

    • [阅读您发布的问题] 哇,比我想象的要复杂。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!这澄清了事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2023-03-13
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多