代码之家  ›  专栏  ›  技术社区  ›  koen

组合:避免多个嵌套foreach

  •  5
  • koen  · 技术社区  · 16 年前

    当您需要检查/拥有数组元素的组合时,如何避免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 回复  |  直到 16 年前
        1
  •  7
  •   Tom Haigh    16 年前

    您可以编写自己的迭代器类来实现 Iterator interface . 然后您可以让它的构造函数接受这三个数组,然后您可以使用它来循环使用foreach的每个组合。

    不过,我认为这会慢很多,所以我会避免。了解您想要避免嵌套foreach循环的原因是很有趣的?

        2
  •  2
  •   Rob Elliott    16 年前

    逻辑上,您必须以某种方式遍历每个项。你只是在绕圈子。

    如果多个for循环看起来很难看,也许您应该将数组放入它们自己的类中,这些类有自己的封装“检查”。

        3
  •  1
  •   Chris Porter    16 年前

    您是否考虑过将每个数组的计数相乘,得到排列的总数,然后执行for i迭代该计数?您必须为每个数组做一些有趣的反操作,但它应该可以工作。

        4
  •  1
  •   Ether    16 年前

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

    是因为乘法嵌套循环让您感到困扰,还是因为方法()被调用了count($as)*count($bs)*count($cs)次?