Kombinationen: Vermeiden mehrerer verschachtelter foreach - php -, verschachtelter, foreach -, verschachtelter - Schleifen

Wenn Sie Array-Elemente prüfen / kombinieren müssen, wie können Sie die Verschachtelung von foreach vermeiden?

Beispielcode:

$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
}
}
}

Jeder mit alternativen Ansätzen, die Nesting vermeiden können?

Antworten:

7 für die Antwort № 1

Sie könnten Ihre eigene Iterator-Klasse schreiben, die das implementiert Iterator-Schnittstelle. Sie könnten dann den Konstruktor die drei Arrays akzeptieren lassen und sie dann verwenden, um jede Kombination mit foreach zu durchlaufen.

Aber ich denke, das wäre deutlich langsamer, also würde ich es vermeiden. Es wäre interessant zu wissen, warum Sie die verschachtelten foreach-Schleifen vermeiden wollen.


2 für die Antwort № 2

Logischerweise müssen Sie jedes Element irgendwie durchlaufen. Sie schlurfen nur herum.

Wenn mehrere For-Schleifen hässlich aussehen, sollten Sie Ihre Arrays vielleicht in ihre eigenen Klassen einfügen, die ihre eigenen gekapselten "Checks" haben.


1 für die Antwort № 3

Haben Sie darüber nachgedacht, die Anzahl von jedem zu übernehmen?Array und multiplizieren sie alle zusammen, um eine Gesamtanzahl von Permutationen zu erhalten, und dann tu ich ein, um diese Zahl zu iterieren? Sie müssten für jedes Array eine lustige Gegenmanipulation durchführen, aber es sollte funktionieren.


1 für die Antwort № 4

Sie haben nicht wirklich genug Informationen gegebenweiß, was die Alternative ist. Wenn Sie method () wirklich mit allen Kombinationen von Optionen aus $ as, $ bs und $ cs aufrufen wollen, dann machen geschachtelte Schleifen das Richtige.

Sind es die mehrfach verschachtelten Schleifen, die Sie stören, oder die Tatsache, dass methode () heißt count ($ as) * count ($ bs) * count ($ cs) mal?


Verwandte Fragen