39 votes

Convertir une syntaxe de point comme "this.that.other" en tableau multidimensionnel en PHP

Tout comme le titre l'indique, j'essaie de créer un analyseur et de trouver la solution optimale pour convertir quelque chose à partir de l'espace de noms de points en un tableau multidimensionnel tel que

s1.t1.column.1 = size:33%

serait la même que

$source['s1']['t1']['column']['1'] = 'size:33%';

55voto

alex Points 186293

Essayez ce numéro...

function assignArrayByPath(&$arr, $path, $value, $separator='.') {
    $keys = explode($separator, $path);

    foreach ($keys as $key) {
        $arr = &$arr[$key];
    }

    $arr = $value;
}

CodePad

Il va boucler les clés (délimitées par . par défaut) pour arriver à la propriété finale, puis faire une assignation sur la valeur.

Si certaines des clés ne sont pas présentes, elles sont créées.

2voto

Erkin Eren Points 21

Vous pouvez utiliser cette fonction pour convertir un tableau de notation de points en tableau multidimensionnel.

function flattenToMultiDimensional(array $array, $delimiter = '.')
{
    $result = [];
    foreach ($array as $notations => $value) {
        // extract keys
        $keys = explode($delimiter, $notations);
        // reverse keys for assignments
        $keys = array_reverse($keys);

        // set initial value
        $lastVal = $value;
        foreach ($keys as $key) {
            // wrap value with key over each iteration
            $lastVal = [
                $key => $lastVal
            ];
        }
        
        // merge result
        $result = array_merge_recursive($result, $lastVal);
    }

    return $result;
}

Exemple :

$array = [
    'test.example.key' => 'value'
];

print_r(flattenToMultiDimensional($array));

Sortie :

Array
(
    [test] => Array
        (
            [example] => Array
                (
                    [key] => value
                )

        )

)

-1voto

Starx Points 38727

Bien que pasrse_ini_file() puisse aussi faire ressortir un tableau multidimensionnel, je vais présenter une solution différente. Zend_Config_Ini()

$conf = new Zend_COnfig_Ini("path/to/file.ini");
echo $conf -> one -> two -> three; // This is how easy it is to do so
//prints one.two.three

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X