组合:避免多个嵌套的foreach

时间:2009-07-23 18:16:58

标签: php nested foreach nested-loops

当你需要检查/拥有数组元素的组合时,如何避免嵌套foreach?

示例代码:

$as = array($optionA1, $optionA2)
$bs = array($optionB1, $optionB2)
$cs = array($optionC1, $optionC2)

foreach ($as as $a) {
    foreach ($bs as $b) {
      foreach ($cs as $c) {
          $result = $this->method($a, $b, $c);
          if ($result) etc
      }
    }
}

任何可以避免嵌套的替代方法?

4 个答案:

答案 0 :(得分:7)

您可以编写自己的Iterator类来实现Iterator interface。然后,您可以让它的构造函数接受三个数组,然后您可以使用它来遍历与foreach的每个组合。

但是我认为这会慢得多,所以我会避免它。知道你想避免嵌套的foreach循环的原因会很有趣吗?

答案 1 :(得分:2)

逻辑上,你必须以某种方式遍历每个项目。你只是在这个过程中徘徊。

如果多个for循环看起来很难看,也许你应该把你的数组放到他们自己的类中,这些类有自己的封装'检查'。

答案 2 :(得分:1)

您是否考虑过对每个数组进行计数并将它们相乘以获得总排列数,然后为i迭代该数组?你必须为每个数组做一些有趣的反操作,但它应该有效。

答案 3 :(得分:1)

您还没有提供足够的信息来了解替代方案。如果你真的想用$ as,$ bs和$ cs中的所有选项组合调用method(),那么嵌套循环将做正确的事。

是多重嵌套循环困扰​​你,还是被调用方法()计数($ as)* count($ bs)* count($ cs)次?