json_encode matriz PHP dispersa como matriz JSON, no objeto JSON

119

Tengo la siguiente matriz en PHP:

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

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

Quiero codificarlo JSON como una matriz 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_encodea esta matriz, obtengo lo siguiente:

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

que es un objeto en lugar de una matriz.

¿Cómo puedo json_encodecodificar mi matriz como una matriz?

Martijn Pieters
fuente

Respuestas:

194

Está observando este comportamiento porque su matriz no es secuencial: tiene claves 0y 2, pero no tiene 1como clave.

Tener índices numéricos no es suficiente. json_encodesolo 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 volver a indexar su matriz secuencialmente usando la array_valuesfunción para obtener el comportamiento que desea. Por ejemplo, el siguiente código funciona correctamente en su caso de uso:

echo json_encode(array_values($input)).
Nguyen Van Vinh
fuente
4
pero ¿y si las claves 0,2son importantes? Estoy en la misma situación en la que no puedo volver a indexar la matriz.
shyammakwana.me
2
JSON no admite matrices asociativas. consulte: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh
74

Arrayen JSONson solo matrices indexadas , por lo que la estructura que está tratando de obtener no es Json / Javascript válido.

La matriz PHP Associatives son objetos en JSON, por lo que, a menos que no necesite el índice, no puede hacer tales conversiones.

Si desea obtener dicha estructura, puede hacer:

$indexedOnly = array();

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

json_encode($indexedOnly);

Will devuelve algo como:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]
Boris Guéry
fuente
1
Gracias por darme la pista de la matriz indexada :) el problema fue que la indexé de tal manera que la identificación también era la identificación de la matriz en lugar de una identificación secuencial y json_encode no la recogió como una matriz sino como en en su lugar, porque la matriz no era secuencial, ahora se solucionó, gracias por toda su ayuda, muchachos :)
No es verdad. Algunas bibliotecas codifican matrices asociativas como matrices con el índice como una de las propiedades del elemento.
Gustavo
No entiendo lo que quiere decir: la matriz en la respuesta de Martin no está indexada, y eso es JSON válido.
Y finalmente el
@AndFinally, la matriz en la respuesta de Martin está indexada implícitamente. La omisión de índice da como resultado una matriz indexada que comienza desde cero.
Boris Guéry
Esta respuesta no proporcionó lo que el OP quería en el momento en que publicaron la pregunta (como era de esperar, ya que lo que quería el OP era imposible), y sus ediciones desde entonces han dejado esta respuesta aparentemente tremendamente incorrecta dado el estado actual del pregunta. No puede eliminar esta respuesta, ya que se acepta, pero ¿tal vez marcar para que un moderador la elimine por usted? Como tiene más de 5 votos a favor, mantendrás tu reputación.
Mark Amery
0

json_decode ($ jsondata, verdadero);

true convierte todas las propiedades en una matriz (secuencial o no)

Robert Sinclair
fuente
no se relaciona con la pregunta hecha por OP. OP preguntó específicamente si se encontró un problema de codificación al usarjson_encode
pg2286
¿Cómo no se relaciona esto? esto muestra un ejemplo del uso de json_encode para convertir los datos en una matriz legible. La pregunta de OP es "¿Cómo puedo hacer que json_encode codifique mi matriz como una matriz", mi parte del código hace exactamente eso ... Estoy diciendo que es la palabra "Codificar" la que te está causando problemas? Por "codificar" quiere decir "se convierte en". Esa no es una razón para votar en contra.
Robert Sinclair
oh, veo tu punto ahora, que recomendarías algo como esto $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); finalmente finallySerializedInArrayFormat = json_encode($unserialize);si esto es lo que pretendes, tienes razón, pero parecía una pequeña solución sin aliento.
pg2286
-1

Prueba esto,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>
Y0Gi
fuente
esto no resuelve el problema de lo que el OP está tratando de preguntar.
pg2286