Combinações / permutações de matriz aninhadas PHP

Eu pensei que meu problema tinha sido resolvido usando esta solução , usando a resposta do VolkerK, mas parece que não está funcionando corretamente.

O que eu quero é uma function que retorna todas as combinações possíveis de valores contidos em arrays nesteds.

Por exemplo, se eu passar

[ ['a', 'b'], ['a', 'b'], ['a', 'b'], ['a'], ['a'], ['a'] ]

Retornaria

 a, a, a, a, a, a b, b, b, a, a, a a, a, b, a, a, a a, b, a, a, a, a b, a, a, a, a, a a, b, b, a, a, a b, b, a, a, a, a b, a, b, a, a, a 

O problema de usar a resposta do VolkerK como abaixo, é que está apenas retornando

 a, a, a, a, a, a b, b, b, a, a, a a, a, a, a, a, a b, b, b, a, a, a a, a, a, a, a, a b, b, b, a, a, a a, a, a, a, a, a b, b, b, a, a, a 

Como o código abaixo pode ser corrigido para retornar a combinação adequada que fiz acima? (ou você pode escrever uma nova function que faz o acima?)

 source = $source; $this->size = 1; foreach ( $source as $a ) { $this->size *= count($a); } } public function count() { return $this->size; } public function offsetExists($offset) { return is_int($offset) && $offset size; } public function offsetGet($offset) { $rv = array(); for ($c = 0; $c source); $c++) { $index = ($offset + $this->size) % count($this->source[$c]); $rv[] = $this->source[$c][$index]; } return $rv; } public function offsetSet($offset, $value ){} public function offsetUnset($offset){} } $pa = new PermArray( [['x'], ['y', 'z', 'w'], ['m', 'n']] ); $cnt = $pa->count(); for($i=0; $i<$cnt; $i++) { echo join(', ', $pa[$i]), "\n"; } 

Aqui está uma solução bastante “direta”, não elegante (ou feia, se você quiser), e não corresponde à sua ordem esperada (se você se importar):

 function P(array $sources) { $result=array(); $cache=array(); foreach($sources as $node) { $cache=$result; $result=array(); foreach($node as $item) { if(empty($cache)) { $result[]=array($item); } else { foreach($cache as $line) { $line[]=$item; $result[]=$line; } } } } return $result; } $result=P(array(array('a','b'),array('a','b'),array('a','b'),array('a'),array('a'),array('a'))); print_r(array_map(function($a){return implode(",",$a);},$result)); 

Demonstração ao vivo

Saída:

 Array ( [0] => a,a,a,a,a,a [1] => b,a,a,a,a,a [2] => a,b,a,a,a,a [3] => b,b,a,a,a,a [4] => a,a,b,a,a,a [5] => b,a,b,a,a,a [6] => a,b,b,a,a,a [7] => b,b,b,a,a,a ) 

Alterei sua syntax [] para array() para fornecer mais compatível com versões anteriores (mas a function anônima requer PHP 5.3).