2012-09-24 38 views
5

si hago esto:resultados diferentes para json_encode() de PHP

$new_arr = array(
0 => 'keyboard', 
1 => 'mouse', 
2 => 'computer' 
); 

print_r(json_encode($new_arr)); 

Salida:

[ "teclado", "ratón", "ordenador"]

Pero Supongo que busco todas las filas de la tabla "producto" de mi base de datos y hago esto:

$product_with_id_map = array(); 
foreach($query as $result) { 
$product_with_id_map[$result->id] = $result->name; 
} 
print_r(json_encode($product_with_id_map)); 

Salida:

{ "0": "Keyboard", "1": "ratón", "2": "ordenador"}

realmente necesito para retener la llave de la array cuando json_encode también me puede decir cómo lograr el segundo resultado en el primer ejemplo?

+1

Así que me sale bien su pregunta: el segundo formulario de salida es el deseado, ¿no? – vzwick

+0

sí, exactamente, quiero conservar las teclas de matriz en mi json_encode –

+2

* "Realmente necesito conservar la clave de la matriz cuando json_encode ..." * Bueno, técnicamente tienes. Las claves son las mismas en ambos ejemplos. Pero el primero es una matriz, el otro es solo un objeto con claves de propiedad que consisten completamente de dígitos. Si el lenguaje que decodifica este JSON es JavaScript, es una diferencia muy sutil (ya que las teclas de matriz son cadenas en JavaScript - [sí, realmente] (http://blog.niftysnippets.org/2011/01/myth-of-arrays). html)). Otros idiomas pueden variar. –

Respuesta

6

Echa la matriz al objeto.

$new_arr = array(
    0 => 'keyboard', 
    1 => 'mouse', 
    2 => 'computer' 
); 

print_r(json_encode((object)$new_arr)); 
// output: {"0":"keyboard","1":"mouse","2":"computer"} 

addtion: Si utiliza este resultado en javascript, le sugiero que utilice la matriz, matriz también es objeto de JavaScript, además, proporcionar más métodos y length propiedad para usted.

+0

sí perfecto que funciona, ¿puedes decirme por qué obtuve resultados diferentes? –

+0

@ user1537158 - porque las matrices funcionan de forma diferente a los objetos en JSON. – vzwick

+0

@xdazz: ni siquiera necesita convertir la matriz en objeto. La salida de json_encode puede contener claves, ya que está usando una secuencia numérica incremental para construir una matriz, la salida json_encode omite las claves. Eso realmente no tiene efecto cuando convierte esa cadena json_encoded en matriz, las claves volverán en secuencia incremental.Intente cambiar la clave '1' a' 4' y vea la salida json_encode –

8

Utilice las opciones (since PHP 5.3):

print_r(json_encode($product_with_id_map, JSON_FORCE_OBJECT)); 
2

Esto sucede porque los índices que están siendo devueltos desde la base de datos están regresando como cadenas y así se están codificados en el JSON también. Donde, como cuando estás creando el conjunto tú mismo, los estás configurando como enteros y, por lo tanto, están siendo ignorados.

Usted podría tratar

$new_arr = array(
'0' => 'keyboard', 
'1' => 'mouse', 
'2' => 'computer' 
); 

print_r(json_encode($new_arr)); 

o puede trun la matriz en un objeto que preservará los índices.

print_r(json_encode((object)$new_arr)); 
+0

Tu primer código no funcionará, no hará ninguna diferencia a menos que lo lances a objeto. – xdazz