2012-06-25 26 views
90

I tienen la siguiente matriz en PHP:json_encode matriz PHP escaso como array JSON, no objeto JSON

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

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

Quiero JSON codifican como un array JSON, produciendo una cadena como la siguiente:

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

Pero cuando llamo json_encode en esta serie, me sale el siguiente:

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

que es un objeto ins tead de una matriz.

¿Cómo puedo obtener json_encode para codificar mi matriz como una matriz, en su lugar?

Respuesta

137

Usted está observando este comportamiento porque la matriz no es secuencial - tiene teclas 0 y 2, pero no tiene 1 como clave.

Simplemente tener índices numéricos no es suficiente. json_encode solo codificará su matriz PHP como una matriz JSON si su matriz PHP es secuencial; es decir, si sus claves son 0, 1, 2, 3, ...

Puede reindexar su matriz secuencialmente utilizando la función array_values para obtener el comportamiento que desea. Por ejemplo, el código siguiente funciona con éxito en el caso de uso:

echo json_encode(array_values($input)). 
+2

¡Gracias, esta es una respuesta clara que funcionó para mí en una situación similar! –

+2

+1 para una solución limpia de una línea. Sin embargo, todavía se apunta a Boris por ilustrar la solución "long hand" – jacobross85

+0

, pero ¿y si las claves '0,2' son importantes? Estoy en la misma situación en la que no puedo reindexar array. –

69

Array en JSON están indexados gama única, por lo que la estructura que está tratando de conseguir no es válida JSON/Javascript.

PHP Associatives array son objetos en JSON, por lo tanto, a menos que no necesite el índice, no podrá realizar dichas conversiones.

Si desea obtener una estructura tal que puede hacer:

$indexedOnly = array(); 

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

json_encode($indexedOnly); 

Will vuelve algo como:

[ 
    [0, "name1", "n1"], 
    [1, "name2", "n2"], 
] 
+1

, gracias por darme la idea de matriz indexada :) el problema estaba en un índice i de una manera tal que el id fue también el id de la matriz en lugar de una identificación secuencial y json_encode no lo recogió como una matriz, sino como un objeto en su lugar porque la matriz no era secuencial. Se corrigió ahora gracias por toda su ayuda, muchachos :) –

+0

No es cierto. Algunas bibliotecas codifican matrices asociativas como matrices con índice como una de las propiedades de los elementos. – Gustavo

+0

No entiendo lo que quiere decir: la matriz en la respuesta de Martin no está indexada, y eso es JSON válido. –

-1

probar esto,

<?php 
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?> 
+0

esto no resuelve el problema que el OP intenta hacer. – user504879

0

json_decode ($ jsondata, true);

cierto convierte todas las propiedades a array (secuenciales o no)

+0

no se relaciona con la pregunta formulada por OP. Pregunta específica de OP sobre el problema de codificación encontrado usando 'json_encode' – user504879

+0

¿Cómo no está relacionado esto? esto muestra un ejemplo de uso de json_encode para convertir los datos en una matriz legible. La pregunta de OP es: "¿Cómo puedo obtener json_encode para codificar mi matriz como una matriz"? Mi bit de código hace precisamente eso. Estoy diciendo que es la palabra "Encode" la que te está causando el "greef". Por 'codificar' él quiere decir 'se convierte en'. Esa no es una razón para rechazar votos. –

+0

oh veo su punto de ahora, que usted recomendaría algo como esto '$ serializado = json_encode ($ nonContiguousArray);' '$ unserialize = json_decode ($ serializado, true);' finalmente 'finallySerializedInArrayFormat = json_encode ($ unserialize); ' si esto es lo que pretende, tiene razón, pero parecía una solución sin aliento. – user504879