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


Tackacoder
Auteur
Réponse acceptée

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

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.

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.

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

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;
    }
}

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 ;)

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