2010-05-09 8 views
5

que tienen esta matriz:Todas las posibilidades en la matriz 2D

$array = array 
(
    array('1', '2', '3'), 
    array('!', '@'), 
    array('a', 'b', 'c', 'd'), 
); 

Y yo quiero saber Todos combinación de caracteres de matrices sub .. por ejemplo:

1!a 
1!b 
1!c 
1!d 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
2!a 
2!b 
2!c 
2!d 
[email protected] 
[email protected] 
... 

Actualmente estoy teniendo este código:

for($i = 0; $i < count($array[0]); $i++) 
{ 
    for($j = 0; $j < count($array[1]); $j++) 
    { 
     for($k = 0; $k < count($array[2]); $k++) 
     { 
      echo $array[0][$i].$array[1][$j].$array[2][$k].'<br/>'; 
     } 
    } 
} 

funciona, pero creo que es feo, y cuando estoy agregando más matrices, tengo que añadir más de. Estoy bastante seguro de que hay una manera de hacer esto recursivamente, pero no sé cómo comenzar/cómo hacerlo. ¡Un poco de ayuda podría ser agradable!

Gracias!

Respuesta

4

Se puede crear una función recursiva de esta manera:

function combination($array, $str = '') { 
    $current = array_shift($array); 
    if(count($array) > 0) { 
     foreach($current as $element) { 
      combination($array, $str.$element); 
     } 
    } 
    else{ 
     foreach($current as $element) { 
      echo $str.$element . PHP_EOL; 
     } 
    } 
} 

continuación:

combination($array); 

Si usted quiere tener todas las combinaciones en una nueva matriz, en lugar de imprimirlos, extender la función como ese:

function combination($array, array &$results, $str = '') { 
    $current = array_shift($array); 
    if(count($array) > 0) { 
     foreach($current as $element) { 
      combination($array, $results, $str.$element); 
     } 
    } 
    else{ 
     foreach($current as $element) { 
      $results[] = $str.$element; 
     } 
    } 
} 

$results = array(); 
combination($array, $results); 
+0

¿Cómo no se rompe esto en PHP 5? Quiero decir, funciona ... pero ¿por qué? Pensé que recordaba haber leído algo acerca de matrices y objetos que siempre pasaban por referencia ahora ... ¿no significaría que $ array se destrozó? – cHao

+0

@cHao: las matrices no se pasan por referencia. Es por eso que utilizo '&' para pasar explícitamente la matriz '$ result' por referencia en el segundo ejemplo. –

Cuestiones relacionadas