2010-05-09 9 views
5

ho questa matrice:Tutte le possibilità a matrice 2D

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

e voglio sapere tutto combinazione di caratteri di sub-array .. per esempio:

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] 
... 

Attualmente sto avendo questo codice:

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/>'; 
     } 
    } 
} 

funziona, ma penso che sia brutto, e quando sto aggiungendo più array, devo aggiungere di più per. Sono abbastanza sicuro che ci sia un modo per farlo in modo ricorsivo, ma non so come iniziare/come farlo. Un piccolo aiuto potrebbe essere bello!

Grazie!

risposta

4

È possibile creare una funzione ricorsiva in questo modo:

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

Poi:

combination($array); 

Se si desidera avere tutte le combinazioni in un nuovo array, piuttosto che a stamparle, di estendere la funzione così:

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

Come questo non si rompe in PHP 5? Voglio dire, funziona ... ma perché? Pensavo di aver ricordato di aver letto qualcosa sugli array e sugli oggetti sempre passati per riferimento ora ... non significherebbe che $ array viene mutilato? – cHao

+0

@cHao: gli array non vengono passati per riferimento. Ecco perché uso '&' per passare esplicitamente l'array '$ result' per riferimento nel secondo esempio. –

Problemi correlati