2009-03-26 9 views
8

Estoy tratando de json_encode una matriz que se devuelve desde una consulta Zend_DB.¿Cómo codifico una matriz PHP en una matriz JSON, no objeto?

var_dump da: (Adición manual de 0 miembro no cambia la imagen.)

array(3) { 
    [1]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "1" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "test 1" 
    } 
    [2]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "2" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "test 1" 
    } 
    [3]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "3" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "jhghjg" 
    } 
} 

La cadena codificada que parece:

{"1":{"comment_id":"1","erasable":"1","comment":"test 1"}, 
"2":{"comment_id":"2","erasable":"1","comment":"test 1"}, 
"3":{"comment_id":"3","erasable":"1","comment":"jhghjg"}} 

Lo que necesito es:

[{"comment_id":"1","erasable":"1","comment":"test 1"}, 
{"comment_id":"2","erasable":"1","comment":"test 1"}, 
{"comment_id":"3","erasable":"1","comment":"jhghjg"}] 

que es lo que la documentación php.ini/json_encode dice que debería ser.

Respuesta

12

¿Cómo está configurando su matriz inicial?

Si configurarlo como:

array(
"1" => array(...), 
"2" => array(...), 
); 

entonces usted no tiene un array con índices numéricos sino cuerdas, y eso es convertido a un objeto en JS mundo. Esto también puede suceder si no establece un orden estricto (es decir, comienza en 0 en lugar de 1).

Esto es un tiro en la oscuridad, sin embargo, porque no puedo ver a su código original: prueba a configurar la matriz sin necesidad de utilizar llaves en absoluto en el primer lugar:

array(
array(...), 
array(...), 
); 
+2

+1 # una matriz que no comienza con 0 porque su clave no es una matriz. phps fault por tener un lovechild bastardo raro de array/hash que funciona correctamente como ninguno. –

+0

El código es lo que se devuelve como un resultado de consulta Zend_DB –

+0

Como dije, eso no lo convierte en una matriz, eso lo convierte en un hash con una clave numérica, que solo * sucede * en este caso para estar cerca de 0 en el comenzar porque eso es lo que tienen los datos en la base de datos. –

2

Una forma común de probar una matriz continua tradicional en php es comprobar si hay un índice '0'. Intente agregar eso a su matriz, probablemente lo considere como una matriz en lugar de hashmap.

6

ha añadido información que se expande en Seb's la respuesta.

php > print json_encode(array('a', 'b', 'c')) ; 
["a","b","c"] 
php > print json_encode(array(0 => 'a', 1 => 'b', 2 => 'c')) ; 
["a","b","c"] 
php > print json_encode(array(1 => 'a', 2 => 'b', 3 => 'c')) ; 
{"1":"a","2":"b","3":"c"} 
php > 

Nota: su formato de esta manera con una buena causa:

Si se va a enviar

{"1":"a","2":"b","3":"c"} 

como

["a","b","c"] 

Cuando lo hizo $data[1] en PHP que lo haría vuelve a "a", pero en el lado de JavaScript, obtendrías "b".

-3

tuve un problema similar, lo puse en funcionamiento después de agregar '' (comillas simples) alrededor de la cadena json_encode. Siguiente desde mi archivo js:

var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING 
var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING 
+1

Eso no tiene ningún sentido. Se ampliará a 'var myJsVar = '{" 1 ":" a "....}'' que es una * cadena *, no una matriz. Deberás decodificarlo de algún modo en JS Land para hacerlo utilizable, ya sea entregándolo a un analizador JSON adecuado o haciendo 'myJsVar = eval (myJsVar') en algún momento posterior. –