2010-05-09 4 views
5

Je possède ce tableau:toutes les possibilités tableau 2d

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

Et je veux savoir toutes les combinaisons de caractères des sous-réseaux .. par exemple:

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

Actuellement, j'ai ce code:

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

il fonctionne, mais je pense qu'il est laid, et quand je suis en ajoutant plus de tableaux, je dois ajouter plus pour. Je suis assez sûr qu'il ya une façon de le faire récursive, mais je ne sais pas comment commencer/comment le faire. Un peu d'aide pourrait être sympa!

Merci pour vous!

Répondre

4

Vous pouvez créer une fonction récursive comme ceci:

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

Puis:

combination($array); 

Si vous voulez avoir toutes les combinaisons dans un nouveau tableau, plutôt que de les imprimer, étendre la fonction comme ça:

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

Comment cela ne casse pas dans PHP 5? Je veux dire, ça marche ... mais pourquoi? Je pensais que je me suis souvenu avoir lu quelque chose au sujet des tableaux et des objets toujours se passer par référence maintenant ... ne serait pas que cela signifie $ array se déchiquetés? – cHao

+0

@cHao: Les tableaux ne sont pas passés par référence. C'est pourquoi j'utilise '&' pour passer explicitement le tableau '$ result' par référence dans le second exemple. –