在同一个数组上使用嵌套的 foreach 循环

Posted

技术标签:

【中文标题】在同一个数组上使用嵌套的 foreach 循环【英文标题】:Using nested foreach loop on same array 【发布时间】:2014-05-18 09:39:13 【问题描述】:

是否可以在嵌套循环中再次循环数组并更改数组?

我有一个 URL 的数组,其中包含 URL 或域的条目(作为数组键):example.com

如果是这个条目:domain:example.com,我想删除所有包含 example.com 作为域的 URL:

foreach (array_keys($urls1) as $line) 
        if (preg_match('/domain:(.*)/i', $line, $matches)) 
            $domain = $matches[1];
            foreach (array_keys($urls1) as $line2) 
                if ($url_domains[$line2] == $domain) 
                    unset($urls1[$line2]);
                
            
        
    

【问题讨论】:

循环一遍肯定没问题。但我不确定是否可以修改以及如何修改。 最好使用array_walkarray_map。如果这段代码能正常工作,我看不出有什么理由改变它。 ***.com/questions/10057671/… ***.com/questions/1685689/… ***.com/questions/2008866/… 【参考方案1】:

第二次循环它没有问题,但是如果你开始删除项目,你会让你自己和你的代码陷入一个大结。我的建议是保存一份副本并进行修改。

这并不理想,但我不确定你想做什么。

//Make a copy of your array
$URLCopy  = $urls1;

foreach (array_keys($urls1) as $line) 
    if (preg_match('/domain:(.*)/i', $line, $matches)) 
        $domain = $matches[1];
        foreach (array_keys($urls1) as $line2) 
            if ($url_domains[$line2] == $domain) 
                unset($URLCopy[$line2]);
            
        
    
 

【讨论】:

【参考方案2】:

我遇到了类似的问题,复制数组就是答案。这是我的问题:

如果在文件开头存在特定文本字符串并且(大约 80 个成员的数组)匹配到文件末尾的字符串,我必须在末尾删除三行。我不使用副本时发生的问题是索引会从 30 重置为 9,这给我带来了一些问题。

这对我有用。

$rowCopy = $row

foreach($row as $index => &$line) 

    ////previous code

    if ($line[0] === "NM1" && $line[1] === "77") 
        //read through the $row array and find the NM*85 string
        foreach ($rowCopy as $index2 => $lineT) 

            if ($s = strpos($lineT, "NM1*85") !== false) 
                $npiTest = explode("*", $lineT);
                if (strcmp(preg_replace("/[^0-9,.]/", "", $npiTest[9]), $line[9]) === 0) 
                    // $line = false;
                    $index--;
                    unset($row[$index + 1]);
                    $index++;
                    unset($row[$index + 1]);
                    $index++;
                    unset($row[$index + 1]);
                    $erased = $erased + 3;
                    $index++
                
            
        

    


【讨论】:

以上是关于在同一个数组上使用嵌套的 foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章

php foreach 嵌套循环大数组很慢?

PHP:我需要嵌套的 foreach 循环还是多个数组?

交替循环嵌套的foreach循环

前端进阶知识

在解析的 JSON 嵌套数组上运行 foreach

无法让 ForEach 循环在 SwiftUI 中使用嵌套的 JSON 数据运行 [关闭]