Formation par Olivier Duffez

Formation au référencement par Olivier Duffez, créateur de WebRankInfo !
Une formule efficace alliant théorie et pratique, avec une haute disponibilité des intervenants
Cette formule a déjà convaincu plusieurs centaines d'entreprises, pourquoi pas vous ?
Réservez vite votre place en ligne (convention possible pour imputer sur le budget formation)

Formation référencement Marseille

[Résolu / Algo] combinaisons

Poster un nouveau sujet Imprimer cette discussion    Forum -> Administration d'un site Web   Les dernières discussions de ce forum sont disponibles au format RSS
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 
Didier_S
WRInaute passionné
WRInaute passionné

Inscrit le: 24 Aoû 2004
Messages: 562
Localisation: Paris

URL permanente de ce messagePosté le : Lun Aoû 01, 2005 2:14    Sujet du message: [Résolu / Algo] combinaisons

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 ?)


Dernière édition par Didier_S le Lun Aoû 01, 2005 4:57; édité 1 fois
 
Didier_S Visiter le site web du posteur
Tisha
WRInaute discret
WRInaute discret

Inscrit le: 20 Aoû 2003
Messages: 54
Localisation: Montréal

URL permanente de ce messagePosté le : Lun Aoû 01, 2005 4:21    Sujet du message: Re: [Algo] combinaisons, besoin d'aide

Didier_S a écrit:

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 écrit:

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 écrit:

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
 
Tisha
Didier_S
WRInaute passionné
WRInaute passionné

Inscrit le: 24 Aoû 2004
Messages: 562
Localisation: Paris

URL permanente de ce messagePosté le : Lun Aoû 01, 2005 4:36    Sujet du message: [Résolu / Algo] combinaisons

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 ! Razz
 
Didier_S Visiter le site web du posteur
SuperPJ
WRInaute passionné
WRInaute passionné

Inscrit le: 15 Jan 2005
Messages: 513
Localisation: Paris, France

URL permanente de ce messagePosté le : Lun Aoû 01, 2005 4:59    Sujet du message: [Résolu / Algo] combinaisons

Arf j'avais la solution mais Tisha a été plus rapide Wink
 
SuperPJ Visiter le site web du posteur
 
Montrer les messages depuis:   
Revenir en haut    Forum -> Administration d'un site Web Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1 - 
Connexion
Nom d'utilisateur:    Mot de passe:      Se connecter automatiquement à chaque visite    

Autres sujets de discussion :

CLIQUEZ ICI pour vous inscrire à WebRankInfo (forum, annuaire, outils...)

Connexion

© 2001-2005 phpBB Group, support français
Personnalisation : WebRankInfo ™


 ODP  Firefox  Alsacreations  annuaire webmaster Yagoort