Génération de combinaisons sans répétition avec ordre.

ViPHP
ViPHP | 3607 Messages

12 déc. 2013, 23:19

Bonsoir à tous,

Je suis actuellement à la recherche d'un code pour générer les combinaisons possibles d'un tableau sans répétition et de toutes les tailles possibles.
Comme je ne suis pas un as pour expliquer le besoin, voici un exemple avec le tableau [A,B,C] :
A
AB
AC
ABC
ACB
B
BA
BC
BAC
BCA
C
CA
CB
CAB
CBA
Et je ne trouve pas ce que je souhaite, j'ai cherché un bon moment et j'ai trouvé ceci par exemple : php-debutant/combinaison-lettres-t33035.html mais l'ordre n'est pas pris en compte.
J'avoue etre bien perdu, j'ai tenté différentes choses, mais je ne parviens pas à mes fins...
Si une bonne ame pouvait m'indiquer un algorithme en pseudo code utilisable ?

Merci d'avance pour votre aide !

Mammouth du PHP | 2278 Messages

13 déc. 2013, 12:42

Je réfléchissais là-desus quand je suis tombé sur ce mystère (j'ai réduit le code au problème)
<?PHP
print "<h1>test</h1>";
$nb=6;
for ($i = 0; $i < $nb; $i++)
{
 	print "<br> I $i";
//idem avec $k = $i+1
	for($k = 0; $k < $nb; $k++);
	{
		print "<br> I $i K $k";			
	}	
}
$i = 0;

while ($i < $nb)
{
	 	print "<br> I $i";
	 	$k = 0;
	 	while ($k < $nb)
	 	{
		print "<br> I $i K $k";		
		$k++;		 		
	 	}
	$i++; 	
}
?>
sortie
test

I 0
I 0 K 6
I 1
I 1 K 6
I 2
I 2 K 6
I 3
I 3 K 6
I 4
I 4 K 6
I 5
I 5 K 6
I 0
I 0 K 0
I 0 K 1
I 0 K 2
I 0 K 3
I 0 K 4
I 0 K 5
I 1
I 1 K 0
I 1 K 1
I 1 K 2
I 1 K 3
I 1 K 4
I 1 K 5
I 2
I 2 K 0
I 2 K 1
I 2 K 2
I 2 K 3
I 2 K 4
I 2 K 5
I 3
I 3 K 0
I 3 K 1
I 3 K 2
I 3 K 3
I 3 K 4
I 3 K 5
I 4
I 4 K 0
I 4 K 1
I 4 K 2
I 4 K 3
I 4 K 4
I 4 K 5
I 5
I 5 K 0
I 5 K 1
I 5 K 2
I 5 K 3
I 5 K 4
I 5 K 5
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

13 déc. 2013, 13:07

function combine($tab,$longueur) {
     if ($longueur == 0) {
        return (array(''));
     }
     $result = array();
     for ($i=1;$i++;$i<=$longueur) {
        foreach ($tab as $index=>$valeur) {
            $tab2 = $tab;
            unset($tab2[$index]);
            $tab3 = combine($tab2,$longueur-1);
            foreach ($tab3 as $valeur3) {
                $result[] = $valeur . $valeur3;
            }
     }
     return $result; 
  }
  var_dump(combine(array('A','B','C'),3))
 
Non testé. Surtout, je ne sais pas si $tab2 = $tab duplique le tableau ou utilise les pointeurs.