Combinações: evitando vários ancestrais nesteds

Quando você precisa verificar / ter combinações de elementos de matriz, como você pode evitar aninhar foreach?

Exemplo de código:

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

Qualquer pessoa com abordagens alternativas que possam evitar o nidificação?

Você poderia escrever sua própria class Iterator, que implementa a interface Iterator . Você poderia então ter seu construtor aceitar os três arrays e, em seguida, você pode usá-lo para superar todas as combinações com foreach.

No entanto, acho que isso seria significativamente mais lento, então eu o evitaria. Seria interessante conhecer os motivos que você deseja evitar os laços ancorados do foreach?

Logicamente, você deve iterar através de cada item de alguma forma. Você está apenas arrastando o processo.

Se múltiplas for loops parecerem feias, talvez você deva colocar seus arrays em suas próprias classs, que tenham seus próprios “cheques” encapsulados.

Você considerou levar a contagem de cada matriz e multiplicá-los todos juntos para obter um número total de permutações e, em seguida, fazer um para i para iterar essa contagem? Você teria que fazer alguma manipulação de contador engraçado para cada matriz, mas deveria funcionar.

Você realmente não deu informações suficientes para saber qual é a alternativa. Se você realmente quiser chamar método () com todas as combinações de opções de $, $ bs e $ cs, os loops nesteds farão o que é certo.

É o multiplicar loops nesteds que o incomoda, ou o fato de que o método () está sendo chamado count ($ as) * count ($ bs) * count ($ cs) vezes?