在同一个数组上使用嵌套的 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_walk
或array_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 循环的主要内容,如果未能解决你的问题,请参考以下文章