Plusieurs tableaux à combiner

Par Tackacoder, il y a 8 ans


Bonjour,

J'ai une problèmatique que je n'arrive pas à résoudre. Je veux combiner plusieurs tableaux pour obtenir un tableau multi-dimensionnel avec toutes les valeurs sous formes de branches.

Un exemple

j'ai 3 tableaux

$step1 = [1, 2]; $step2 = [3, 4, 5]; $step3 = [6, 7];

ce que je veux obtenir, de façon dynamique. Dans mon exemple, il y 3 tableaux, mais dans mon projet, je peux monter à 10 tableaux dans le même genre.

$combine = [ 1 => [ 3 => [ 6, 7 ], 4 => [ 6, 7 ], 5 => [ 6, 7 ] ], 2 => [ 3 => [ 6, 7 ], 4 => [ 6, 7 ], 5 => [ 6, 7 ] ] ];

En gros, chaque tableau doit fusionner avec les éléments des tableaux du dessus.
Je n'ai pas de bout de code à présenter, j'ai essayé plusieurs approches sans arriver à mon résultat...
Si quelqu'un à déjà eu cette problèmatique, ou une idée d'approche.

Merci pour votre aide.

7 réponses

SimonDevelop, il y a 8 ans

Utilise des boucles foreach comme ceci

$step1 = [1, 2]; $step2 = [3, 4, 5]; $step3 = [6, 7]; $combine = []; foreach ($step1 as $v1) { $combine[$v1] = $step2; foreach ($step2 as $v2) { $combine[$v1][$v2] = $step3; } }

Je ne connais pas d'autres moyen pour du native comme ça, si tu souhaite faire ça de façon à ce que ça prend tout nombre de step, il faudrai que tu t'aime d'une librairie php pour générer des tableaux sous forme de chaîne de caractères :

// Une classe permettant de faire ceci $combine = [ 1 => [ 3 => [ 6, 7 ] ] ]; // En utilisant ce genre de fonction $obj->getArray("1.3", [6, 7]);

Je ne sais pas si tu vois ou je veux en venir.

Tackacoder, il y a 8 ans

Merci Simon pour ta réponse, mais cette technique n'est pas "dynamique".
Imagine que je rajoute 2 nouveaux tableaux, il faudra recoder la fonction, et ce n'est pas le but.

Mon idée, c'est que peut importe le nombre de tableaux, le rendu soit le même que ci-dessus.

SimonDevelop, il y a 8 ans

J'ai ré-édité mon poste pour répondre à cette problématique.

Tackacoder, il y a 8 ans

Voilà un début de code pour montrer un peu plus ce que je cherche. Le problème, c'est que je n'arrive pas à aller plus loin que le 2nd niveau.

$ar1 = [752, 882]; $ar2 = [860, 786, 795]; $ar3 = [783, 769, 879, 849, 880]; $steps = [$ar1, $ar2, $ar3]; foreach ($steps as $step) { Step::setAutomated($step, count($steps)); } class Step { private static $automated = []; /** * @param $products */ public static function setAutomated($products, $nbSteps) { if (empty(self::$automated)) { foreach ($products as $product) { self::$automated[$product] = []; } } else { self::recursiveAutomatedSteps($products, self::$automated, $nbSteps); } } /** * @param $products * @param array $selfAutomated * * @return array */ private static function recursiveAutomatedSteps($products, $selfAutomated = [], $nbSteps) { foreach ($selfAutomated as $id => $children) { if (empty($children)) { foreach ($products as $product) { $selfAutomated[$id][$product] = []; } } else { self::recursiveAutomatedSteps($products, $selfAutomated[$id], $nbSteps); } } self::$automated = $selfAutomated; } }
SimonDevelop, il y a 8 ans

Regarde cette librairie php-dot-notation, elle te permet de gérer la profondeur de t'es tableaux en utilisant du string, à toi de gérer tes boucles avec pour générer t'es profondeur en string ;)

Tackacoder, il y a 8 ans

Merci Simon, je vais regarder cette librairie en détail

Tackacoder, il y a 8 ans

J'ai fait autrement, problèmatique que je n'ai pas réussi à résoudre dans ce sens.