Tableau PHP fragmenté json_encode comme tableau JSON, pas objet JSON

119

J'ai le tableau suivant en PHP:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

Je veux l'encoder JSON en tant que tableau JSON, produisant une chaîne comme celle-ci:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

Mais lorsque j'appelle json_encodece tableau, j'obtiens ce qui suit:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

qui est un objet au lieu d'un tableau.

Comment puis-je json_encodeencoder mon tableau en tant que tableau?

Martijn Pieters
la source

Réponses:

194

Vous observez ce comportement parce que votre tableau n'est pas séquentiel - il a des clés 0et 2, mais pas 1comme clé.

Le simple fait d'avoir des index numériques ne suffit pas. json_encoden'encodera votre tableau PHP en tant que tableau JSON que si votre tableau PHP est séquentiel - c'est-à-dire si ses clés sont 0, 1, 2, 3, ...

Vous pouvez réindexer votre tableau de manière séquentielle en utilisant la array_valuesfonction pour obtenir le comportement souhaité. Par exemple, le code ci-dessous fonctionne correctement dans votre cas d'utilisation:

echo json_encode(array_values($input)).
Nguyen Van Vinh
la source
4
mais que faire si les clés 0,2sont importantes? Je suis dans la même situation où je ne peux pas réindexer le tableau.
shyammakwana.me
2
JSON ne prend pas en charge les tableaux associatifs. voir: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh
74

Arraydans JSONsont des tableaux indexés uniquement , donc la structure que vous essayez d'obtenir n'est pas valide Json / Javascript.

Les tableaux PHP Associatifs sont des objets en JSON, donc à moins que vous n'ayez besoin de l'index, vous ne pouvez pas effectuer de telles conversions.

Si vous souhaitez obtenir une telle structure, vous pouvez faire:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Will retourne quelque chose comme:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]
Boris Guéry
la source
1
Merci de m'avoir donné l'indice du tableau indexé :) le problème était que je l'ai indexé de telle manière que l'id était également l'id du tableau au lieu d'un id séquentiel et json_encode ne l'a pas pris en tant que tableau mais comme dans objet à la place parce que le tableau n'était pas séquentiel, il est corrigé maintenant merci pour toute votre aide les gars :)
Pas vrai. Certaines bibliothèques codent les tableaux associatifs sous forme de tableaux avec l'index comme l'une des propriétés d'élément.
Gustavo
Je ne comprends pas ce que vous voulez dire - le tableau dans la réponse de Martin n'est pas indexé, et c'est JSON valide.
Et enfin
@AndFinally, le tableau de la réponse de Martin est en fait indexé, implicitement. L'omission d'index entraîne un tableau indexé à partir de zéro.
Boris Guéry
Cette réponse ne fournissait pas tout à fait ce que le PO voulait au moment où il a posté la question (sans surprise, puisque ce que le PO voulait était impossible), et leurs modifications depuis lors ont laissé cette réponse apparemment très erronée étant donné l'état actuel du question. Vous ne pouvez pas supprimer cette réponse, car elle est acceptée, mais peut-être demander à un modérateur de la supprimer pour vous? Puisqu'il a plus de 5 votes positifs, vous garderez votre représentant.
Mark Amery
0

json_decode ($ jsondata, vrai);

true transforme toutes les propriétés en tableau (séquentiel ou non)

Robert Sinclair
la source
ne concerne pas la question posée par OP. OP a spécifiquement demandé un problème d'encodage rencontré en utilisantjson_encode
pg2286
comment n'est-ce pas lié? ceci montre un exemple d'utilisation de json_encode afin de transformer les données en un tableau lisible. La question d'OP est "Comment puis-je obtenir json_encode pour encoder mon tableau en tant que tableau". C'est exactement ce que fait mon morceau de code. Par «encoder», il veut dire «se transforme en». Ce n'est pas une raison pour voter contre.
Robert Sinclair
oh je vois votre point maintenant, que vous recommanderiez quelque chose comme ça $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); finalement finallySerializedInArrayFormat = json_encode($unserialize);si c'est ce que vous voulez dire que vous avez raison, mais cela semblait être une solution un peu distordue.
pg2286
-1

Essaye ça,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>
Y0Gi
la source
cela ne résout pas le problème que le PO tente de demander.
pg2286