39 votes

Convertir la syntaxe à points comme "this.that.other" en un tableau multidimensionnel en PHP

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

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

serait identique à

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

0voto

miken32 Points 8438

Après plus d'une décennie, personne n'a réellement répondu à la question de la conversion de la chaîne x en tableau y. La réponse acceptée s'en est approchée de plus près, mais suppose toujours l'existence d'un tableau et nécessite une valeur séparée.

J'ai eu besoin de faire exactement cela dans un script ponctuel rapide, donc ma réponse fait ce que la question demande, tout en permettant une certaine personnalisation des séparateurs et une vérification d'erreur de base :

 $ret ?? trim($value)];
    }

    // return the array, or an empty array in case somehow the loop was missed
    return $ret ?? [];
}

$source = dotKvToArray("s1.t1.column.1 = size:33%");
echo json_encode($source);

Résultat :

{"s1":{"t1":{"column":{"1":"size:33%"}}}}

-1voto

Starx Points 38727

Bien que pasrse_ini_file() puisse également générer un tableau multidimensionnel, je vais présenter une solution différente. Zend_Config_Ini()

$conf = new Zend_Config_Ini("chemin/vers/fichier.ini");
echo $conf -> one -> two -> three; // C'est aussi simple que ça
//affiche one.two.three

-3voto

orjtor Points 55

J'ai trouvé une solution qui a fonctionné pour moi sur : Convertir un tableau PHP plat en tableau imbriqué basé sur les clés du tableau et comme j'avais un tableau basé sur un fichier .ini avec des clés différentes, j'ai fait une petite modification de ce script et le travail a fonctionné pour moi.

Mon tableau ressemblait à ceci:

[resources.db.adapter] => PDO_MYSQL
[resources.db.params.host] => localhost
[resources.db.params.dbname] => qwer
[resources.db.params.username] => asdf
...

À la demande, voici le code que j'ai décrit comme fonctionnant pour moi:

";
print_r($db_settings);
echo "

"; $resources = array(); foreach ($db_settings as $path => $value) { $ancestors = explode('.', $path); set_nested_value($resources, $ancestors, $value); } echo " "; print_r($resources); echo ""; /** * Donnez-lui un tableau et un tableau de parents, il descendra dans les tableaux imbriqués et définira la valeur. */ function set_nested_value(array &$arr, array $ancestors, $value) { $current = &$arr; foreach ($ancestors as $key) { // Pour gérer l'entrée d'origine, si un élément n'est pas un tableau, // le remplacer par un tableau avec la valeur comme premier élément. if (!is_array($current)) { $current = array( $current); } if (!array_key_exists($key, $current)) { $current[$key] = array(); } $current = &$current[$key]; } $current = $value; }

Voici la source du fichier .ini lu par le parse_ini_file():

Array
(
    [resources.db.adapter] => PDO_MYSQL
    [resources.db.params.host] => localhost
    [resources.db.params.dbname] => dbname
    [resources.db.params.username] => dbname_user
    [resources.db.params.password] => qwerqwerqwerqwer
    [resources.db.params.charset] => utf8
    [externaldb.adapter] => PDO_MYSQL
    [externaldb.params.host] => localhost
    [externaldb.params.dbname] => dbname2
    [externaldb.params.username] => dbname_user2
    [externaldb.params.password] => qwerqwerwqerqerw
    [externaldb.params.charset] => latin1
)

Voici le résultat du code ci-dessus:

Array
(
    [resources] => Array
        (
            [db] => Array
                (
                    [adapter] => PDO_MYSQL
                    [params] => Array
                        (
                            [host] => localhost
                            [dbname] => dbname
                            [username] => dbname_user
                            [password] => qwerqwerqwerqwer
                            [charset] => utf8
                        )

                )

        )

    [externaldb] => Array
        (
            [adapter] => PDO_MYSQL
            [params] => Array
                (
                    [host] => localhost
                    [dbname] => dbname2
                    [username] => dbname_user2
                    [password] => qwerqwerwqerqerw
                    [charset] => latin1
                )

        )
)

-4voto

Starx Points 38727

Je suis assez sûr que vous essayez de faire cela pour stocker des données de configuration ou similaires.

Je vous suggère vivement de sauvegarder ce fichier en tant que .ini et d'utiliser la fonction parse_ini_file() pour changer les données de configuration en un tableau multidimensionnel. Aussi simple que cela

$confArray = parse_ini_file("filename.ini"); 
var_dump($confArray);

-4voto

Lloyd Watkin Points 197

Rapide et sale...

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