Parcourir des tableaux, toutes combinaisons possibles ?

Petit nouveau ! | 9 Messages

18 nov. 2008, 11:48

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 :
$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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 nov. 2008, 12:23

Est-ce qu'il est possible de voir la structure de tes tables ?

Parce que tu demandes est un bête produit cartésien, ce qui est l'enfance de l'art en SQL ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

18 nov. 2008, 12:41

Voici grosso modo les differentes tables :

Table caracteristiques_noms :
- id
- nom

EX :
--
1 - Couleur
2 - Taille
3 - Matière

Table caracteristiques_details :
- id
- id_caracteristiques_noms
- valeur

EX :
--
1 - 1 - bleu
2 - 1 - blanc
3 - 1 - rouge
4 - 2 - L
5 - 2 - XL
6 - 2 - XXL
(etc....)

Voilà, en espérant que ça t'ait avancé.... ;-)
merci d'avance pour ton aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 nov. 2008, 16:14

Fait moi un dump de ta table (avec données) pour que je tente quelques trucs stp

PS : comment exporter un dump
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

18 nov. 2008, 16:25

Fait moi un dump de ta table (avec données) pour que je tente quelques trucs stp

PS : comment exporter un dump
OK, voici :

Code : Tout sélectionner

-- Version du serveur: 5.0.27 CREATE TABLE `caracteristiques_details` ( `id` int(11) unsigned NOT NULL auto_increment, `id_caracteristiques_noms` int(11) unsigned NOT NULL, `valeur` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=59 ; INSERT INTO `caracteristiques_details` (`id`, `id_caracteristiques_noms`, `valeur`) VALUES (43, 28, 'bleu'), (44, 28, 'blanc'), (45, 28, 'rouge'), (46, 28, 'vert'), (47, 28, 'jaune'), (48, 28, 'noir'), (49, 28, 'vert caca d''oie'), (50, 29, 'S'), (51, 29, 'M'), (52, 29, 'L'), (53, 29, 'XL'), (54, 29, 'XXL'), (55, 30, 'cuir'), (56, 30, 'daim'), (57, 30, 'coton'), (58, 30, 'peau de zob'); CREATE TABLE `caracteristiques_noms` ( `id` int(11) unsigned NOT NULL auto_increment, `nom` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ; INSERT INTO `caracteristiques_noms` (`id`, `nom`) VALUES (28, 'Les couleurs'), (29, 'Tailles disponibles'), (30, 'matière');
C'est normal si les id ne commencent pas à 1, c'est parce que je multiplie mes tests ;-)
En tout cas merci beaucoup de t'intéresser à mon problème. En espérant que l'on pourra enfin en venir à bout !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 nov. 2008, 18:16

Une simple requête de ce genre te permet d'obtenir ce que tu demandes

Code : Tout sélectionner

SELECT taille.valeur, couleur.valeur FROM caracteristiques_details AS taille, caracteristiques_details AS couleur WHERE taille.id_caracteristiques_noms =28 AND couleur.id_caracteristiques_noms =29
Mais je ne sais pas trop comment automatiser la jointure pour chaque caractéristique :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

20 nov. 2008, 16:19

Bonjour,

J'ai finalement trouvé cette solution, sur un autre forum. Cela répond exactement à ce que je recherchais :
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. ;-)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 nov. 2008, 16:31

Modération :
inetys, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute