当你需要检查/拥有数组元素的组合时,如何避免嵌套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
}
}
}
任何可以避免嵌套的替代方法?
答案 0 :(得分:7)
您可以编写自己的Iterator类来实现Iterator interface。然后,您可以让它的构造函数接受三个数组,然后您可以使用它来遍历与foreach的每个组合。
但是我认为这会慢得多,所以我会避免它。知道你想避免嵌套的foreach循环的原因会很有趣吗?
答案 1 :(得分:2)
逻辑上,你必须以某种方式遍历每个项目。你只是在这个过程中徘徊。
如果多个for循环看起来很难看,也许你应该把你的数组放到他们自己的类中,这些类有自己的封装'检查'。
答案 2 :(得分:1)
您是否考虑过对每个数组进行计数并将它们相乘以获得总排列数,然后为i迭代该数组?你必须为每个数组做一些有趣的反操作,但它应该有效。
答案 3 :(得分:1)
您还没有提供足够的信息来了解替代方案。如果你真的想用$ as,$ bs和$ cs中的所有选项组合调用method(),那么嵌套循环将做正确的事。
是多重嵌套循环困扰你,还是被调用方法()计数($ as)* count($ bs)* count($ cs)次?