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 :

Parcourir des tableaux, toutes combinaisons possibles ?


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Parcourir des tableaux, toutes combinaisons possibles ?
    Salut !

    Voilà mon problème :

    J'ai repris une boutique en ligne (vente de vêtements) dont je ne dois pas toucher à la structure principale. On m'a demandé de rajouter un système de gestion des stocks, pour chaque combinaison de caractéristiques.

    Par exemple, prenons les caractéristiques suivantes pour un vêtement donné :

    -------------
    Couleurs :
    - bleu
    - rouge
    - vert

    Tailles :
    - L
    - M
    - XL
    -------------

    En faisant une requête en base, j'obtiens le tableau PHP suivant :

    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
    $tab_stock
    (
        [couleur] => Array
            (
                [0] => bleu
                [1] => rouge
                [2] => vert
            )
     
        [taille] => Array
            (
                [0] => L
                [1] => M
                [2] => XL
            )
     
    )
    Maintenant, il faut que je génère dynamiquement, et à partir de ce tableau PHP, toutes les combinaisons possibles. A savoir :
    - bleu,L
    - bleu, M
    - bleu, XL
    - rouge, L
    - rouge, M
    - rouge, XL
    - vert, L
    - vert, M
    - vert, XL

    Ma question est :

    Comment générer dynamiquement chaque combinaison de caractéristiques à partir du tableau PHP précédent, sachant que *le nombre de caractéristiques peut varier, et qu'il peut exister d'autres sortes de caractéristiques* (par exemple, une caractéristique "matière", qui contient "cuir, daim", etc) ?

    J'ai essayé en imbriquant des boucles foreach et for, mais jamais je n'ai réussi à trouver une solution convenable. :-(

    La structure du tableau PHP doit-elle être modifiée ?
    J'attends avec impatience vos lumières, @ bientôt !

    Seb

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    dans ton cas l'imbrication de deux boucles suffit amplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($tab_stock['couleur'] as $couleur){
        foreach($tab_stock['taille'] as $taille){
            echo $couleur.', '.$taille;
        }
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Bonjour,

    dans ton cas l'imbrication de deux boucles suffit amplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($tab_stock['couleur'] as $couleur){
        foreach($tab_stock['taille'] as $taille){
            echo $couleur.', '.$taille;
        }
    }
    Hé non ! Car comme je dis dans mon exemple, il se peut très bien que pour un autre produit, j'ai une caractéristique supplémentaire (je donnais comme exemple la caractéristique "matière", ayant pour valeurs "daim, cuir, etc").

    Je me retrouverais dans ce cas avec les caractéristiques "couleur, taille, caracteristiques". Donc ton exemple n'est pas bon dans ce cas, je cherche vraiment qq chose de souple, qui puisse gérer tous les cas de configuration...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Tu calcule la profondeur de ton tableau Niv1 et tu fais de la récursivité !

    Enjoy !

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par lespoches Voir le message
    Tu calcule la profondeur de ton tableau Niv1 et tu fais de la récursivité !

    Enjoy !
    OK, mais ça marche comment la heu... récursivité ?

  6. #6
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2008
    Messages : 185
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par seb92500 Voir le message
    OK, mais ça marche comment la heu... récursivité ?
    Bonsoir,
    Le principe de base de la récursivité, c'est de relancer une fonction à partir d'elle même !

    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
    $num = 1;
    foreach( $array As &$el ){
      reset( $el );
      $num *= count( $el );
    }
     
    $possibilities = array( );
    for( $i = $num; $i > 0; $i-- ){
      if( !next($array[count( $array)-1]) )
        for( $j = count( $array ) -1; $j >= 0; $j-- )
          if( next( $array[ $j ] ) === FALSE )
            reset( $array[ $j ] );
          else
            break;
      $possibilities[ $i ] = '';
      foreach( $array as &$el )
        $possibilities[ $i ] .= current( $el );
    }
    sort( $possibilities );
    Mais, ce petit bout de code peux faire la même chose ^_^
    Enfin, à peu de choses près ... j'ai été obligé de changer tes clefs lettrées par des clefs chiffrées :/
    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
    $array = Array(
        0 => Array
            (
                0 => 'bleu',
                1 => 'rouge',
                2 => 'vert',
            ),
     
        1 => Array
            (
                0 => 'L',
                1 => 'M',
                2 => 'XL',
            ),
        2 => Array
            (
                0 => 'A',
                1 => 'B',
                2 => 'C',
    	)
    );
    Et ca me donne
    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
    23
    24
    25
    26
    27
    bleu L B
    bleu L C
    bleu M A
    bleu M B
    bleu M C
    bleu XL A
    bleu XL B
    bleu XL C
    rouge L A
    rouge L B
    rouge L C
    rouge M A
    rouge M B
    rouge M C
    rouge XL A
    rouge XL B
    rouge XL C
    vert L A
    vert L B
    vert L C
    vert M A
    vert M B
    vert M C
    vert XL A
    vert XL B
    vert XL C
    bleu L A
    ( Et j'ai rajouté un sort( ) de ce tableau après, pour éviter d'avoir le bleu L A à la fin )
    Bonne chance !
    LoveAngel :: Meow( );
    Personne ne remarque ce qui marche trop bien. Procrastination, Terry Pratchett

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Voici un exemple de parcours de tableau récursivement

    Tu n'as plus qu'à adapter !

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?
    // $constructeur contient la gamme Renault et Citroen 
    // on se contentera de deux constructeurs : ça suffira pour l'exemple :) 
    $constructeur = array(); 
     
    $constructeur['Renault']['Citadines'] = array('Twingo','Clio'); 
    $constructeur['Renault']['Berlines'] = array('Megane','Laguna'); 
    $constructeur['Renault']['Monospaces'] = array('Scenic','Espace'); 
     
    $constructeur['Citroen']['Citadines'] = 'Saxo'; 
    $constructeur['Citroen']['Berlines'] = array('Xsara','Xantia'); 
    $constructeur['Citroen']['Monospaces'] = array('Picasso','Evasion'); 
     
    function afficher_tableau($tableau)  
        { 
        // on fait une boucle qui lit les éléments du tableau 
        foreach ($tableau as $cle=>$valeur)  
            { 
            // si l'un des éléments est lui même un tableau 
            // alors on applique la fonction à ce tableau 
            if(is_array($valeur))  
                { 
                // on affiche le nom de la clé et 
                // le début d'une liste pour 
                //  décaler le contenu vers la droite 
                echo $cle.' : <ul>';  
     
                // ici se réalise la récursivité 
                // c'est à dire qu'on applique la fonction 
                // à l'élément en cours car c'est lui aussi un tableau 
                afficher_tableau($valeur);  
     
                // on ferme la liste 
                echo '</ul>';  
                } 
     
            // si ce n'est pas un tableau 
            // alors on affiche le contenu de l'élément 
            else 
                { 
                echo $cle.' = '.$valeur.' <br>';   
                } 
            }  
        }  
     
     
    afficher_tableau($constructeur); 
     
    /* 
    ce qui va afficher : 
    
    Renault : 
        Citadines : 
            0 = Twingo 
            1 = Clio 
    
        Berlines : 
            0 = Megane 
            1 = Laguna 
    
        Monospaces : 
            0 = Scenic 
            1 = Espace 
    
    Citroen : 
        Citadines = Saxo 
        Berlines : 
            0 = Xsara 
            1 = Xantia 
    
        Monospaces : 
            0 = Picasso 
            1 = Evasion 
    */ 
    ?>

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    J'ai finalement trouvé cette solution, sur un autre forum. Cela répond exactement à ce que je recherchais :

    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
    function creuse($tableaux,$ligne){
     
        $suite=$tableaux;
        array_shift($suite);
        $criteres=$GLOBALS[$tableaux[0]];
     
        foreach($criteres as $crit){
            if(count($tableaux)==1) echo $ligne.'-'.$crit.'<br/>';
            else creuse($suite, $ligne.'-'.$crit);
        }
    }
     
    $tailles=array('L','M','XL');
    $couleurs=array('rouge','vert','jaune','bleu');
    $matieres=array('cuir','daim','croco');
     
    $criteres=array('couleurs','tailles','matieres');
    $vide='';
     
    creuse($criteres,$vide);

    Merci à tous pour votre participation. ;-)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    $_GLOBALS :S

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par lespoches Voir le message
    $_GLOBALS :S
    ??

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

Discussions similaires

  1. Stocker dans un tableau toutes les combinaisons possibles entre plusieurs tableaux.
    Par gui-yem dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 19/03/2014, 15h22
  2. Trouver toutes les combinaisons possibles de plusieurs tableaux
    Par divayht dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 23/08/2010, 20h56
  3. [Tableaux] toute combinaison de lettres possible
    Par olkabil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2008, 16h50
  4. parcourir des tableaux pour faire des copies/renommages de fichiers
    Par Paloma dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 31/10/2006, 09h09
  5. permutations/combinaisons sur des tableaux dynamiques
    Par pEAk230 dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2006, 13h18

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