Code JSON d'un tableau multidimensionnel donnant des résultats différents

en faisant un json_encode un tableau multidimensionnel en PHP, je remarque une sortie différente simplement en nommant un des tableaux, par opposition à ne pas les nommer. Par Exemple:

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
json_encode($arrytest)

donne un tableau unique de plusieurs objets json

[{"a":1,"b":2},{"c":3},{"d":4}];

alors qu'attribuer simplement un nom au tableau du milieu

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4));
json_encode($arrytest)

crée un seul objet json avec plusieurs objets json à l'intérieur de

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}};

pourquoi la 1ère option pas retournez les mêmes raisons que le 2e exécut avec " 1 "à la place de"secondarray"

18
demandé sur Felix Kling 2012-05-28 06:25:11

3 réponses

En JSON, tableaux [] seuls tous ont des clés numériques, alors que les objets {} ont des propriétés string. L'inclusion d'une clé de tableau dans votre second exemple force l'ensemble de la structure externe à être un objet par nécessité. Les objets intérieurs des deux exemples sont faits comme des objets à cause de l'inclusion de touches de chaîne a,b,c,d.

Si vous utilisez l' JSON_FORCE_OBJECT option sur le premier exemple, vous devriez obtenir à nouveau une structure similaire à la seconde, avec la structure externe d'un objet plutôt qu'un tableau. Sans spécifier que vous le voulez comme un objet, L'absence de touches de chaîne dans le tableau extérieur fait supposer à PHP qu'il doit être encodé comme la structure équivalente du tableau dans JSON.

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));

// Force the outer structure into an object rather than array
echo json_encode($arrytest , JSON_FORCE_OBJECT);

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}}
27
répondu Michael Berkowski 2012-05-28 02:29:52

Les tableaux avec des clés numériques continues sont encodés comme des tableaux JSON. C'est juste la façon dont il est. Pourquoi? Parce que c'est logique.

puisque les clés peuvent être exprimées implicitement par l'encodage du tableau, il n'y a aucune raison de les encoder explicitement comme des clés d'objet.

Voir tous les exemples dans le json_encode documentation.

1
répondu Felix Kling 2012-05-28 02:36:36

à la première option vous avez seulement des index numériques (0, 1 et 2). Bien qu'elles ne soient pas explicitement déclarées, php les crée automatiquement.

à la deuxième option, vous déclarez un des index comme une chaîne de caractères et cela fait que PHP transforme en interne tous les index en chaîne de caractères.

quand vous encodez json le premier tableau, il n'est pas nécessaire de montrer les entiers dans la chaîne JSON générée car n'importe quel décodeur devrait être capable de "deviner" qu'ils sont 0, 1 et 2.

mais dans le second tableau, c'est nécessaire, car le décodeur doit connaître la valeur clé dans votre tableau.

C'est assez simple. Pas d'index déclaré dans la gamme? Ils sont 0, 1, 2, 3 et ainsi de suite.

0
répondu Fernando 2012-05-28 02:36:18