IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Boucles imbriquées


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut [Tableaux] Boucles imbriquées
    Bonjour,

    Je rencontre un souci avec des boucles imbriquées. Je suis sûr que c'est un problème plutôt courant (certains d'entre vous vont peut être trouver ça enfantin) mais je me casse la tête dessus depuis un moment.
    Je vais essayer d'expliquer le problème le plus clairement possible.

    J'ai un tableau qui s'appelle $tableau. Ce tableau contient lui même 4 tableaux qui contiennent les éléments suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $tableau = array();
    $tableau[0] = array('pomme','ananas','cassis','fraise');
    $tableau[1] = array('vert','rouge','bleu');
    $tableau[2] = array('rond','carré','triangulaire');
    $tableau[3] = array('debout','assis');
    Je voudrais combiner les éléments des tableaux entre eux pour obtenir toutes les combinaisons d'éléments possibles. Dans mon exemple, il y a 4*3*3*2 = 72 combinaisons distinctes. Chaque combinaisons doit être stockée dans un tabelau $combinaisons (à l'aide d'un array_push par exemple).

    Exemple de combinaisons pour vous aider à comprendre ce que je souhaite faire :

    pomme - vert - rond - debout
    pomme - vert - rond - assis
    pomme - vert - carré - debout
    pomme - vert - carré - assis
    pomme - vert - triangulaire - debout
    pomme - vert - triangulaire - assis

    etc...

    J'ai essayé avec des boucles imbriquées mais je ne trouve pas la bonne solution pour générer ces combinaisons.

    Je remercie par avance ceux d'entre vous qui se pencheront sur mon problème.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 394
    Points : 15 755
    Points
    15 755
    Par défaut
    montre nous ce que tu as déjà essayé et ce qui ne fonctionne pas

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Voilà un petit bout de code de ce que j'ai déjà essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    for ($i= 0; $i < count($tableau[0]); $i++)
    {
    	for ($j= 0; $j < count($tableau[1]); $j++)
    	{
    		for ($k= 0; $k < count($tableau[2]); $k++)
    		{
    			for ($l= 0; $l < count($tableau[3]); $l++)
    			{
    				$compteur++;
    				echo $tableau[0][$i].' - '.$tableau[1][$j].' - '.$tableau[2][$k].' - '.$tableau[3][$l]."<br>";
    			}
    		}
    	}
    }
     
    echo "<br>COMPTEUR = ".$compteur;
    Là c'est sûr, ça marche. Mais le problème c'est que je ne sais pas à l'avance combien il y aura de tableaux dans $tableau. Et donc il faudrait que je crée des boucles for dynamiquement en bouclant sur $tableau pour récupérer le nombre de tableaux que cette variable contient.

    Je sens comme une odeur de récursivité là et ça me rassure pas tellement

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 394
    Points : 15 755
    Points
    15 755
    Par défaut
    Citation Envoyé par setblue
    Je sens comme une odeur de récursivité là et ça me rassure pas tellement
    et moi ce qui ne me rassure pas c'est que je ne vois pas comment t'expliquer comment faire sans te donner le code ...
    ah si j'ai trouvé, je vais faire un code à trous, à toi de mettre ce qu'il faut à la place des petits points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function ajouterCombinaisonRecursif(&$resultats, $prefixe, $listes)
    {
        if (count($listes) == 0) {
            $resultats[] = $prefixe;
        } else {
            $liste = array_shift($listes);
     
            foreach ($liste as $element) {
                ajouterCombinaisonRecursif($resultats, ..., ...);
            }
        }
    }
     
    $tableau = array(
        array('pomme', 'ananas', 'cassis', 'fraise'),
        array('vert', 'rouge', 'bleu'),
        array('rond', 'carré', 'triangulaire'),
        array('debout', 'assis'),
    );
     
    $resultats = array();
    ajouterCombinaisonRecursif($resultats, '', $tableau);
    regarde d'abord le fonctionnement de la fonction http://php.net/array_shift

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Ahem :p

    Euh je sais ce que fait un array_unshift (retourner un tableau amputé de son premier élément). Par contre, je ne comprend pas tout ton code.

    Je pense que mon cerveau fait de la résistance à la simple évocation du concept de récursivité.

    Ce que je comprend :

    Ta fonction <b>ajouterCombinaisonRecursif($resultats, '', $tableau)</b> récupére le tableau dans lequel on va enregistrer les combinaisons ($resultats), un $prefixe (dans lequel passe le début de la combinaison à enregistrer, enfin je crois) et le tableau général (qui à chaque execution de la fonction est amputé de son premier élément).

    Je pense que dans la fonction à trous, le troisième argument est la variable $liste, c'est à dire le tableau général amputé.

    Je sèche grave sur l'argument du milieu. Théoriquement il faudrait passer la combinaison...

    ajouterCombinaisonRecursif($resultats, ..., $liste);

    J'ai droit à un indice?

    Edit : Bon j'ai compris Et j'avais tout faux.

    En fait array_shift tronque directement le tableau $listes.

    Il faut donc bien renvoyer $listes en troisième argument de la fonction à trou.

    Et pour la combinaison, il faut passer $prefixe.' '.$element (je récupére le début de la combinaison et je concatène avec l'élément.

    Ca donne ajouterCombinaisonRecursif($resultats,$prefixe.' '.$element,$listes); pour la fonction à trous et cela fonctionne.

    Merci beaucoup pour ton aide

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 394
    Points : 15 755
    Points
    15 755
    Par défaut
    Citation Envoyé par setblue
    J'ai droit à un indice?
    oui
    l'argument du milieu c'est ça : bon et bien là tu as tout le code

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Ah flûte, j'avais compris avant que tu postes mais j'ai posté trop tard. (voir edit de mon message). Tu vas jamais me croire maintenant

    Merci à toi en tout cas.

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 394
    Points : 15 755
    Points
    15 755
    Par défaut
    Citation Envoyé par setblue
    Tu vas jamais me croire maintenant
    mais si je te crois
    par contre je viens de voir que tu avais mis "$liste" sans "s" comme 3e argument, si tu l'avais laissé tu aurais eu droit à une belle boucle sans fin

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Oui c'est parce que j'avais rien compris ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/01/2015, 14h16
  2. Boucles imbriquées, intégrale double, tableaux numpy
    Par Heimdall dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 25/03/2013, 20h43
  3. [Tableaux] Boucle while imbriquer
    Par Le-Cortex dans le forum Langage
    Réponses: 11
    Dernier message: 09/09/2005, 14h22
  4. Boucles imbriquées
    Par Immobilis dans le forum ASP
    Réponses: 28
    Dernier message: 14/01/2005, 13h17
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo