8800 sujets

Développement web côté serveur, CMS

Bonjour,

Je voudrais généré via plusieurs tableaux une liste de toute les possibilités :

Exemple de tableau, le nombre de tableau et de valeur peux varier :

Array
(
    [0] => Array
        (
            [0] => Noire
            [1] => Marron
            [2] => Rouge
            [3] => Crême
        )

    [1] => Array
        (
            [0] => 38
            [1] => 39
            [2] => 40
            [3] => 41
        )

    [2] => Array
        (
            [0] => Logo1
            [1] => Logo2
            [2] => Logo3
        )

)


L'objectif et de ressortir tout les possibilités des trois tableaux sous cette forme :

[0] => Array
        (
            [0] =>Noire-38-Logo1
            [2] =>Noire-38-Logo2
            [3] =>Noire-38-Logo3
            [4] =>Noire-39-Logo1
            [5] =>Noire-39-Logo2
            [..] =>...
        )

J'ai tourné et tester des tas de choses mais j'y arrive pas Smiley decu
Boucle, fonction récursive...

Si quelqu'un peux m'aider ce serai cool.

Merci d'avance.
Modifié par cvneo (01 Oct 2009 - 11:16)
Bonsoir,

C'était plus dur que je ne le pensais ><
En relisant j'ai eu un doute quand tu dis "toutes les possibilités", c'est vraiment toutes ? Ça veux dire qu'on peut avoir truc de ce style ?

[0] => Array 
        ( 
            Noire-38-Logo1
            ... 
            Noire-Logo2-38
            ... 
            38-Noire-Logo2 
            ...
        ) 


Pars qu'en fait ce que j'ai fait ne le fait pas du tout... ><
function toutes_possibilites(array &$a, array &$liste, $nombre_clef_rejeter = 0, $avant = '')
{
	$dernier_array = (1 + $nombre_clef_rejeter === count($a));
	$position = 0;
	foreach ($a as $k => &$values)
	{
		if ($nombre_clef_rejeter === 0 && $nombre_clef_rejeter < $position)
			break;

		if ($nombre_clef_rejeter === $position)
		{
			foreach ($values as $v)
			{
				$tmp = (empty($avant) ? $v : $avant.'-'.$v);
				if ($dernier_array)
					$liste[] = $tmp;
				else
					toutes_possibilites($a, $liste, $nombre_clef_rejeter+1, $tmp);
			}
			break;
		}
		++$position;
	}
}

$a = array
(
	0 => array
		(
			0 => 'Noire',
			1 => 'Marron',
			2 => 'Rouge',
			3 => 'Crême',
		),
	1 => array
		(
			0 => 38,
			1 => 39,
			2 => 40,
			3 => 41,
		),
	2 => array
		(
			0 => 'Logo1',
			1 => 'Logo2',
			2 => 'Logo3',
		),
);
$liste = array();
toutes_possibilites($a, $liste);
var_dump($liste);
Bonjour,

Merci pour ton aide sa marche nikel.

En fait je cherche à avoir toutes les possibilités dans l'ordre des tableau. Mais effectivement pas dans le désordre de ce type :
Noire-Logo2-38
38-Noire-Logo2

C'est pour généré une liste de référence pour des produits de taille et de couleur différente. Et ainsi avoir tout les models possibles...

Donc mon idée de sortie serait donc construire une référence a base des choix possible sur l'article accompagner d'autres infos ce qui corse encore le truc Smiley decu est profiter de la génération des Ref pour calculer le TTC.


[0]['Ref'] =>Noire-38-Logo1 
[0]['PrixHT'] =>10 
[0]['PrixTTC'] =>10 
[1]['Ref'] =>Noire-38-Logo2 
[1]['PrixHT'] =>15 
[1]['PrixTTC'] =>15 
[2]['Ref'] =>Noire-38-Logo3 
[2]['PrixHT'] =>20
[2]['PrixTTC'] =>20
[3]['Ref'] =>Noire-39-Logo1 
[3]['PrixHT'] =>30
[3]['PrixTTC'] =>30
[4]['Ref'] =>Noire-39-Logo2 
[4]['PrixHT'] =>40
[4]['PrixTTC'] =>40


Donc je vais chercher pour intégrer les infos sup via ton code. Si tu a une idée pour les ajouter je suis preneur.

Je te remercie beaucoup sa ma enlevé une grosse épine du pied Smiley biggrin
Bonjour,

Ça complique très peu la chose en fait. Au moment où l'on crée une nouvelle entrée pour la liste, il faut faire un explode sur la chaine et font les calcule à partir de du nouveau tableaux.
On peut aussi envoyer à $avant un tableau au lieu d'un chaine de caractère mais c'est un peu plus lourd.

		foreach ($values as $v)
			{
				if ($dernier_array)
				{
					$tmp = explode('-', $avant);
					$liste[] = array(
						'Ref' => $avant.'-'.$v,
						'PrixHt' => (int)$tmp[1],
						'PrixTTC' => (int)$tmp[1],
					);
				}
				else
				{
					toutes_possibilites($a, $liste, $nombre_clef_rejeter+1, (empty($avant) ? $v : $avant.'-'.$v));
				}
			}