2009-07-23 132 views
5

當您需要檢查/有數組元素的組合時,如何避免嵌套foreach?組合:避免多重嵌套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

爲什麼你想避免嵌套?你擁有的是大多數問題最直觀的解決方案。 – 2009-07-23 18:29:31

+1

澄清:我想避免嵌套,因爲它經常看起來很難顯示編碼良好或清潔。我知道這不是放棄它的理由,但如果有一個更整潔的選擇,我希望聽到它。 – koen 2009-07-23 18:41:54

+1

您可以使用遞歸而不是迭代。這會將您的代碼中的嵌套移動到對象模型中。 (因爲你的例子太設計了,所以很難做出更具體的描述。) – bzlm 2010-02-16 13:22:35

回答

7

你可以編寫自己的Iterator類來實現Iterator interface。然後你可以讓它的構造函數接受三個數組,然後你可以用foreach循環每個組合。

但是我認爲這會明顯變慢,所以我會避免它。知道你想避免嵌套的foreach循環的原因會很有趣嗎?

1

您是否考慮過將每個數組的數量相乘,然後將它們全部相乘以得到總數排列,然後爲我重複計數?你將不得不爲每個數組做一些有趣的計數器操作,但它應該工作。

1

您還沒有真正提供足夠的信息來了解替代方案。如果你真的想用$ as,$ bs和$ cs的所有選項組合來調用method(),那麼嵌套循環會做正確的事情。是否它是困擾你的多重嵌套循環,或者method()被稱爲count($ as)* count($ bs)* count($ cs)次的事實?

2

從邏輯上講,您必須以某種方式遍歷每個項目。你只是在整個過程中洗牌。

如果多個for循環看起來很醜,也許你應該把你的數組放到他們自己的類中,並且有自己的封裝「檢查」。