5

当您需要检查/拥有数组元素的组合时,如何避免嵌套 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

4 回答 4

7

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

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

于 2009-07-23T18:29:44.580 回答
3

从逻辑上讲,您必须以某种方式遍历每个项目。你只是在改变这个过程。

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

于 2009-07-23T18:33:50.157 回答
1

您是否考虑过计算每个数组的计数并将它们全部相乘以获得排列总数,然后执行 a for i 来迭代该计数?您必须对每个数组进行一些有趣的计数器操作,但它应该可以工作。

于 2009-07-23T18:29:12.333 回答
1

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

是多重嵌套循环困扰​​您,还是 method() 被称为 count($as) * count($bs) * count($cs) 次?

于 2009-07-23T18:30:24.203 回答