Mangeur de cigogne Hébergement du site en PHP et Mysql par WDMédia-hébergement
Vous aussi adpotez les éléPHPants de Vincent Pontier !


Rechercher dans le forum

Mots-clés :

Trouver :
un de ces termes tous les termes

Depuis :
7 j 15 j 30 j


Retour à l'index du forum

Parcourir des tableaux, toutes combinaisons possibles ?

Message original de Seb

Le : 18/11/2008 à 10:42:12

Dejà lu 247 fois avant vous

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 :

$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

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 18/11/2008 à 11:04:26

Saluton,
En imbriquant deux boucles foreach, je ne vois pas de difficulté majeure.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Seb

Le : 18/11/2008 à 11:30:22

Salut,

Je ne pense pas que 2 boucles foreach résoudraient le problème, surtout si un troisième type de catégorie pointerait le bout de son nez. (comme je le disais dans mon exemple, imaginons que pour un autre produit, on ait à gérer en plus une caractéristique "matière", contenant les valeurs "daim, cuir, etc).

Il me faut une solution qui soit la plus souple possible et qui puisse gérer un nombre variable de caractéristiques.

Si malgré ça tu penses que ta solution fonctionnerait quand même, pourrais-tu dans ce cas me fournir un exemple ?
Merci d'avance ;-)

Seb

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 18/11/2008 à 12:09:39

Effectivement, dès qu'il y a n tableaux, la génération dynamique de leur produit cartésien devient ardue.
J'intuite qu'il faut chercher un processus récursif, quant à l'écrire, pour le moment, je coince.
@+

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 18/11/2008 à 15:16:47

Pour l'instant j'en suis là
<?php
function creuse($tableaux,$ligne){
    while(
count($tableaux)>0){
        
$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('tailles','couleurs','matieres');
$vide='';
echo 
creuse($criteres,$vide);
?>

Donc ce n'est pas au point, on boucle indéfiniment sur le premier critère.
Mais je regarderai cela plus avant ce soir.
A moins que quelqu'un(e) nous débogue ça d'ici là.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Seb

Le : 18/11/2008 à 15:29:12

OK, c'est gentil de t'intéresser à mon problème ;-)
Moi aussi j'essaie toujours (en vain) quelques possibilités, j'avoue que je m'arrache les cheveux...
En espérant régler mettre un terme positif à ce problème !

@++
Seb

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 18/11/2008 à 15:37:18

Ça y est, je crois que c'est bon ce coup là :
<?php
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('tailles','couleurs','matieres');
$vide='';
echo 
creuse($criteres,$vide);
?>

Je faisais trop compliqué.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Seb

Le : 18/11/2008 à 16:41:48

Merci pour ta proposition, je teste cela dès demain matin, et te tiendrai au courant ;-)

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de luce

Le : 18/11/2008 à 23:03:49

Salut,

Moi j'ai une question

J'ai 3 tailles : S L XL
J'ai 3 couleurs : ROUGE VERT JAUNE

Ton idée est de lister toutes les combinaissons possible, génial !

Mais si j'ai plus de XL JAUNE ?

Tu fais quoi ?

Tu retires aussi le jaune pour le S et le L ou tu acceptes que les gens commandent une reference que tu n'as plus ?

Tu penses pas que faire un SELECT ONCLICK sur la taille, pour afficher les couleurs dispo pour cette taille serait plus simple ?

Enfin, voila ce que j'en dis moi !

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 19/11/2008 à 08:36:12

Le pire, c'est qu'elle a probablement, que dis-je probablemnt, quasi certainement raison, la luce.
Mais bon, c'était rafraîchissant et récréatif ce petit exercice d'algorithmique récursive.
A mon âge, faut s'entretenir les neurones, préventivement (voire curativement, me souffle Dame 4'in) contre l'hydre neuro-dégénérative Alzheimérienne.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de luce

Le : 19/11/2008 à 09:07:32

Re,

Oui, et je voulais aussi parler des ressources serveurs, mais bon, j'ai pensé que c'était pas aussi pertinent :-P

Par contre, MK :


contre l'hydre neuro-dégénérative Alzheimérienne


Tu sais que tu as 3 chances sur 4 pour que ce soit la vache folle ?
Mais on ne te le dira pas, parce que si on te le dissait, la france te devrait un paquet d'indemnité, et avec un temps d'incubasion qui peut aller entre 15 et 25 ans, sa risquerait d'augmenter le trop de la secu !

Avec alz, tu es pris à 100% dans le meilleur des cas, mais la france te doit aucune indemnité !

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Seb

Le : 19/11/2008 à 09:31:14

Réponse à Luce :

Hé ben dans ce cas si je n'ai plus de XL JAUNE, je mettrai la valeur "stock" à 0 tout simplement...
C'est justement là l'intérêt que je puisse faire un listing complet afin de préciser la valeur des stocks, pour TOUTES mes combinaisons...

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 19/11/2008 à 09:36:32

Prions alors pour que ce soit une encéphalopathie spongiforme bovine subaiguë de ces bons docteurs Creutzfeldt et Jakob.
Mais, étant quasiment végétarien (je mange quand même des œufs, de la volaille, du lapin et du poisson) depuis bientôt 20 ans, le risque est théoriquement moindre.
Dommage, encore de juteuses indemnités qui ne vont pas tomber dans notre escarcelle.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de luce

Le : 19/11/2008 à 10:36:37

Reponse à Seb
Invitation pour MK a aller ce caché !


<?php
$taille 
= array('S''L''XL');
$color = array('JAUNE''ORANGE''BLEU');
foreach (
$taille as $taille1) {
        foreach (
$color as $color2) {
             echo 
$taille1." ".$color2."<br>";

        }
}
?>



(pauvre mk) :-P

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Maljuna Kris

Le : 19/11/2008 à 10:42:05

Oui ma chérie, mais comment tu fais si tu ne sais pas, au départ, combien de tableaux de critères tu auras, 1, 2, 3, n.
Ta réponse est celle que j'avais suggérée au départ, imbriquer deux foreach et le tour me semblait joué.

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de luce

Le : 19/11/2008 à 11:44:18

Re,

Ah oui, excuse moi alors, j'avais pas lu qu'il y avait un nombre illimité de criteres

hmmm, c'est vrai, je comprends mieux pourquoi je trouvais ta réponse un peu compliquer...

Je vois un début d'idée mais il me manque un truc et je sais pas quoi ...
Je vais noter ça, ca m'interesse comme fonction :-P

Re: Parcourir des tableaux, toutes combinaisons possibles ?

Réponse de Seb

Le : 20/11/2008 à 15:15:28

Pour Maljuna Kris :

J'ai testé ta fonction creuse(), nickel ça fonctionne comme je le voulais ! ;-)
Merci à chacun pour votre participation.

Seb
Retour à l'index du forum


Ajouter une réponse

Nom :

Email :

Titre :

Message :

Combien font 3 + 2 ?

Mise en forme : gras = [b]...[/b], italic = [i]...[/i], souligné = [u]...[/u], citation = [quote]...[/quote], lien = [url]liens_externe[/url] ou [url nom=texte]liens_externe[/url], code source : [code]...[/code]

Recevoir les réponses par mail :
Oui Non

Mémoriser mon nom et mon email :
Oui Non

 

Charte des forums PHPDébutant

Bienvenue à vous,

Vous voici donc prêt à poster sur les forums de PHPDébutant. Avant toute chose, merci de prendre le temps de lire les quelques lignes qui suivent.

Attention, à partir du moment ou vous postez dans les forums, vous acceptez la présente charte. Si votre message est modéré ou supprimé, vous ne pourrez pas dire que vous n'étiez pas au courant des règles !

Pourquoi une charte

Le but de cette charte est simple : que ces forums restent cordiaux et que les personnes aidant les autres ne se sentent pas lésées, insultées, critiquées. Pour que ces forums fonctionnent, il faut des personnes qui répondent aux questions. Pour que celles ci restent sur le forum, il faut les traiter avec respect, et ne pas les confondre avec des bonnes poires, esclaves, etc...

Mesures de régulation

  • Un nouveau message ne disant pas bonjour, ou insultant, dont le titre est tout en majuscules, pourra être supprimé sans justification (raisons non limitatives).
  • Prenez le temps de vérifier que la question que vous allez poser n'a pas déjà été posée, à l'aide du formulaire de recherche.
  • Prenez également le temps de vérifier que la réponse à votre question ne se trouve pas dans les tutoriaux. Nous ne pouvons pas répeter pour chaque visiteur tous les cours, il sont écrits, profitez-en (dans l'ordre tant qu'à faire) !
  • Nous ne faisons pas de scripts tout prêts. Nous aidons et vous guidons pour que vous puissiez trouver vous même la réponse, ce qui est beaucoup plus formateur.
  • Si vous comptez poster un message publicitaire, abstenez-vous. Au mieux le message sera supprimé, au pire les habitués descendront votre service en flamme.
  • Pour tout message de recrutement, précisez bien votre demande. Inutile de poster pour trouver un développeur pour faire gratuitement votre site de webmastering qui vous rapportera plein de sous. Les seuls coups de mains donnés en développement sont pour des associations ou des sujets passionnant un développeur.
  • Toute personne tenant des propos racistes ou illicites sera bannie et pourra faire l'objet de poursuites.
  • L'humour étant très présent sur ces forums, ne réagissez pas violemment à des propos qui pourraient être à prendre au second degré et avec de l'humour.
  • Attention aux trolls ! Leur multiplication peut entraîner la mort des forums, et sans forum, plus d'aide !
  • Respectez les thèmes des forums. Pensez aussi à vérifier que votre message n'a pas été déplacé si vous le croyez effacé.

Conseils

  • N'oubliez pas que les personnes à qui vous vous adressez sont des bénévoles qui donnent de leur temps pour vous. Si vous êtes méchants avec eux, il n'aideront plus et vous n'aurez plus d'aide !
  • Ne soyez pas pressé. Nous avons une vie aussi, et nous ne sommes par forcément tout le temps disponibles.
  • N'oubliez pas que les smileys sont la pour faire comprendre l'humeur dans laquelle vous rédigez un message. Il est indispensable de mettre des smileys quand vous faites de l'humour, sinon le message pourrait être mal perçu (ca serait quand même idiot de plomber l'ambiance en faisant de l'humour !).
  • Surveillez votre orthographe, nous ne vous demandons pas d'être littéraire, mais que votre message soit au moins compréhensible. Evitez à tout prix le style SMS.
  • Expliquez clairement le problème, ce n'est pas toujours facile, mais mieux vaut essayer de le faire le plus possible.
  • Ne postez pas de questions trop vagues du genre "comment faire un forum". Cela ne sert à rien, cela ne s'explique pas sur un coin de forum.
  • Mettez un titre clair, correspondant au sujet que vous allez poster. A l'aide, au secours, etc... ne sont pas d'une grande utilité pour ceux qui vont vous aider. Parfois nous passons en coup de vent, et si nous ne savons pas ce que va contenir le message, nous ne le regarderons même pas.
  • Ne mettez par [URGENT] ou autre joyeuseté du genre dans vos titres de messages. Cela irrite les gens (il y'a plus urgent dans la vie, pensez aux gens qui meurent de faim ou ayant besoin des pompiers, ça c'est urgent), et vous n'aurez pas votre réponse plus vite pour autant.
  • Si vous connaissez déjà à quel domaine votre question d'adresse (par exemple mysql, html, php, javascript), n'hésitez pas à le marquer au début de votre message, avec un [html] par exemple (notez les minuscules).
  • Ne dites pas "ça marche pas". Il y a toujours des raisons. Je vous invite à consulter le tutorial "ça marche pas" qui vous aidera à mieux expliquer votre problème.
  • Ne postez pas 36000 lignes de code. Sur le forum, le code apparaît non coloré et sans indentation, ce qui est illisible. Au dessus de 5 lignes, plus personne ne lit et vous n'aurez pas de réponse. Utilisez le wall
  • En règle générale restez courtois et clair, n'oubliez pas que la politesse fait partie de la vie courante. Il est de bon ton de dire bonjour même pour une réponse, même plusieurs fois dans la journée (ceux qui vous lisent n'ont pas forcément lu vos autres messsages)

La Fin

Avec tout ces conseils vous augmenterez les chances de réponse, leur pertinence et leur rapidité

Voilà, ça sera tout, bonne écriture :)

Fermer les règles et poster un message


www.phpdebutant.org © 2009 - L'équipe de phpDebutant - Hébergement : WDMédia-hébergement