kombinácie: vyhýbanie sa viacerým vnoreným foreach - php, vnoreným, foreachom, vnoreným slučkám

Keď potrebujete skontrolovať / mať kombinácie prvkov poľa, ako sa môžete vyhýbať hniezdeniu foreach?

Príklad kód:

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

Ktokoľvek s alternatívnymi prístupmi, ktorým sa môžete vyhýbať hniezdeniu?

odpovede:

7 pre odpoveď č. 1

Môžete napísať vlastnú triedu Iterator, ktorá implementuje Rozhranie Iterator, Potom by ste mohli mať svoj konštruktér akceptovať tri polia a potom ho môžete použiť, aby ste previedli každú kombináciu s foreachom.

Myslím si však, že by to bolo podstatne pomalšie, preto by som sa tomu vyhla. Bolo by zaujímavé poznať dôvody, prečo sa chcete vyhnúť vnoreným slučkám foreach?


2 pre odpoveď č. 2

Logicky musíte nejako opakovať jednotlivé položky. Jednoducho sa rozmýšľate okolo procesu.

Ak viacnásobné pre slučky vyzerajú škaredo, možno by ste mali dať svoje pole do svojich vlastných tried, ktoré majú svoje vlastné zapísané "kontroly".


1 pre odpoveď č. 3

Have you considered taking the count of each pole a vynásobiť ich všetky dohromady, aby ste získali celkový počet permutácií a potom urobiť a pre i opakovať tento počet? Budete musieť urobiť nejakú zábavnú manipuláciu s počítadlom pre každé pole, ale to by malo fungovať.


1 pre odpoveď č. 4

Nebolo vám naozaj poskytnuté dostatok informáciívedieť, akú alternatívu je. Ak naozaj chcete zavolať metódu () so všetkými kombináciami možností z $ as, $ bs a $ cs, potom vnorené slučky urobia správnu vec.

Je to viacnásobne vnorené slučky, ktoré vás obťažujú, alebo fakt, že metóda () sa nazýva count ($ as) * count ($ bs) * count ($ cs) times?


Ponuka