Php 组合:避免多个嵌套foreach

Php 组合:避免多个嵌套foreach,php,nested,foreach,nested-loops,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->meth

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

有没有其他方法可以避免嵌套的人?

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

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


然而,我认为这将是显着缓慢,所以我会避免它。了解您想要避免嵌套的foreach循环的原因是很有意思的?

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


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

从逻辑上讲,您必须以某种方式迭代每个项。你只是在这个过程中徘徊


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

为什么要避免嵌套?对于大多数问题,您所拥有的已经是最直观的解决方案。澄清一下:我希望避免嵌套,因为它经常看起来很难显示编码良好或干净的内容。我知道这不是放弃它的理由,但如果有更整洁/更圆滑的替代方案,我想听听。你可以使用递归而不是迭代。这将把嵌套从代码移到对象模型中。(因为你的例子很做作,所以很难说得更具体。)如果投票反对我的人会添加一条评论,那就好了。汤姆,我没有投票反对你,但我知道如何使用这个迭代器接口?如果你给我一个小算法,它将是有用的!谢谢@BannedfromSO并不确定这是一个好的解决方案——三个循环可能更明显,所以我不确定这个例子是否正确worthwhile@bzlm我声称自己无知!当时我是一个非常棒的人!:)