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クラスを作成できます。次に、コンストラクターに3つの配列を受け入れさせ、それを使用してforeachとのすべての組み合わせをループすることができます。

ただし、これはかなり遅くなると思うので、避けたいと思います。ネストされたforeachループを避けたい理由を知ることは興味深いでしょうか?

于 2009-07-23T18:29:44.580 に答える
3

論理的には、どういうわけか各アイテムを反復処理する必要があります。あなたはただプロセスをシャッフルしているだけです。

複数のforループが見苦しい場合は、配列を独自のクラスに配置する必要があります。クラスには、独自のカプセル化された「チェック」があります。

于 2009-07-23T18:33:50.157 に答える
1

各配列の数を取得し、それらをすべて乗算して順列の総数を取得し、次に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 に答える