Page 1 sur 1

Parcourir des tableaux, toutes combinaisons possibles ?

Posté : 18 nov. 2008, 11:48
par inetys
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

Posté : 18 nov. 2008, 12:23
par zeus
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 ;)

Posté : 18 nov. 2008, 12:41
par inetys
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.

Posté : 18 nov. 2008, 16:14
par zeus
Fait moi un dump de ta table (avec données) pour que je tente quelques trucs stp

PS : comment exporter un dump

Posté : 18 nov. 2008, 16:25
par inetys
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 !

Posté : 18 nov. 2008, 18:16
par zeus
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 :?

Posté : 20 nov. 2008, 16:19
par inetys
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. ;-)

Posté : 20 nov. 2008, 16:31
par Truc
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.