[Résolu / Algo] combinaisons

Didier_S

WRInaute occasionnel
Salut !

Petit problème d'algo qui a l'air tout bête, je patauge un peu.
J'ai un gros tableau contenant des "sous-tableaux":
Code:
Array (
   [0] => Array (
           [0] => 1
           [1] => 2
       )
   [1] => Array (
           [0] => a
           [1] => b
           [2] => c
       )
   [2] => Array (
           [0] => X
           [1] => Y
           [2] => Z
       )
)
'aimerais, à partir de ces données, créér un autre tableau, contenant toutes les combinaisons comportant un élément de chaque sous-tableau possible.
C'est à dire : 1-a-X , 1-a-Y, 1-a-Z, 1-b-X, 1-b-Y, ..... , 2-c-Z
...

On m'a répondu de faire :
Code:
foreach($tableau[0] AS $firstcarac) {
 foreach($tableau[1] AS $secondcarac) {
   foreach($tableau[2] AS $thirdcarac) {
      echo "$firstcarac - $secondcarac - $thirdcarac <br>";
   }
 }
}
Ce qui effectivement, marche très bien avec 3 sous tableaux...
Mais si j'ai un $tableau[3], $tableau[4]...
J'aimerais généraliser ça.

Je pense, après y avoir réfléchi, qu'il faut utiliser une fonction récursive.
J'en suis arrivé là :
Code:
function for_each ($a, $nCurrent, $nLimit) {
	global $aRef, $nDepth;
	while($nCurrent < $nLimit) {
		foreach ($a[$nCurrent] as $value) {
			echo "$value<br />";
		}
		$nCurrent++;
		for_each($a, $nCurrent, $nLimit);
	}
	return $aRef;
}
// $a est le tableau décrit au début du post
$nLimit = count($a);
C'est au niveau du "echo $value" que je bloque, en effet, je n'arrive pas à récupérer l'ensemble des valeurs précédentes...
Quelqu'un aurait une piste où me lancer ? (un foreach ? un while ?)
 

Tisha

WRInaute discret
Re: [Algo] combinaisons, besoin d'aide

Didier_S a dit:
Je pense, après y avoir réfléchi, qu'il faut utiliser une fonction récursive.
J'en suis arrivé là :

Oui, la récursivité est l'une des solutions possibles.

Didier_S a dit:
Code:
function for_each ($a, $nCurrent, $nLimit) {
	global $aRef, $nDepth;
	while($nCurrent < $nLimit) {
		foreach ($a[$nCurrent] as $value) {
			echo "$value<br />";
		}
		$nCurrent++;
		for_each($a, $nCurrent, $nLimit);
	}
	return $aRef;
}
// $a est le tableau décrit au début du post
$nLimit = count($a);

en récursivité, il ne faut JAMAIS affecter une variable passée en paramètre car ça altère aussi toutes les instances suivantes de ce paramètre. Le "$nCurrent++" devrait-être plutôt "$n=$nCurrent+1;" et ensuite tu passes $n en valeur de paramètre.

Didier_S a dit:
C'est au niveau du "echo $value" que je bloque, en effet, je n'arrive pas à récupérer l'ensemble des valeurs précédentes...
Quelqu'un aurait une piste où me lancer ? (un foreach ? un while ?)

je suis peut-être fatiguée, mais je vois pas où tu veux en venir avec ta boucle while... je préfèrerais:

Code:
function for_each($a, $nCurrent, $nLimit, $v='') {
  foreach($a[$nCurrent] as $value) {
    if($nLimit==$nCurrent) {echo $v.$value.'<br />';}
    else {
      $w=$v.$value.'-';
      $n=$nCurrent+1;
      for_each($a,$n,$nLimit,$w);
    }
  }
}

for_each($a,0,count($a)-1);

le -1 initial est important dans mon exemple.

Tisha
 

Didier_S

WRInaute occasionnel
en copiant le code, je me suis dit que ca avait l'air tellement simple que tu avais du mal comprendre... et ça marche impeccable, j'ai encore du mal à y croire !

je te remercie infiniment, et je vais de ce pas étudier les itérations de ton code, pour mieux comprendre les principes récursifs (que j'ai trop longtemps ignorés)

tu viens de gagner un esclave dévoué, à vie ! :p
 

Discussions similaires

Haut