combinações: evitando vários foreach aninhados - php, aninhados, foreach, aninhados - loops

Quando você precisa verificar / ter combinações de elementos de matriz, como evitar o aninhamento de cada um?

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 aninhamento?

Respostas:

7 para resposta № 1

Você poderia escrever sua própria classe Iterator que implementa o Interface Iterator. Você pode então ter seu construtor aceitando os três arrays e então você pode usá-lo para fazer um loop sobre cada combinação com foreach.

No entanto, acho que isso seria significativamente mais lento, então eu evitaria isso. Seria interessante saber as razões pelas quais você deseja evitar os loops foreach aninhados?


2 para resposta № 2

Logicamente, você tem que percorrer cada item de alguma forma. Você está apenas mexendo no processo.

Se vários loops forem feios, talvez você deva colocar seus arrays em suas próprias classes, que tenham seus próprios "cheques" encapsulados.


1 para resposta № 3

Você já considerou tomar a contagem de cadaMatriz e multiplicando-os todos juntos para obter um número total de permutações e, em seguida, fazendo um para i para iterar essa contagem? Você teria que fazer alguma contra manipulação para cada array, mas deveria funcionar.


1 para resposta № 4

Você realmente não deu informações suficientes parasabe qual é a alternativa. Se você realmente quiser chamar method () com todas as combinações de opções de $ as, $ bs e $ cs, os loops aninhados farão a coisa certa.

São os loops aninhados múltiplos que incomodam você, ou o fato de que method () está sendo chamado count ($ as) * count ($ bs) * count ($ cs) vezes?


Cardápio