2010-04-22 7 views
5

En PHP ejecuto un mysql_query que tiene una cláusula ORDER BY. Luego estoy iterando a través de los resultados para construir una matriz asociativa, con row_id como clave.¿Se mantendrá el orden de mi matriz asociativa de PHP a Javascript?

Luego, llamo json_encode en esa matriz y obtengo el resultado.

Esta página se carga con AJAX y se define en una variable de Javascript. Cuando repito esa variable de Javascript, ¿seguiré teniendo el orden que fue devuelto por mysql_query?

Respuesta

5

Lo que dice cletus es correcto, pero en mi experiencia, la mayoría de los navegadores mantendrán el orden. Dicho esto, debería considerar usar un Array. Si usted necesita para solucionar el problema, una vez que lo reciba en el lado del cliente, sólo tiene que utilizar la función .sort() en JavaScript:

rows.sort(function(a, b) { 
    return a.row_id - b.row_id; 
} 

A pesar de que parece que funciona, el orden de las propiedades de un objeto no puede ser contado en. Vea los muchos comentarios a continuación para obtener más información (ojos más inteligentes que los míos). Sin embargo, este fue el código que utiliza para probar el comportamiento en mi propia prueba limitada:

var test = { 
    one: 'blah', 
    two: 'foo', 
    another: 'bar' 
}; 

for (prop in test) { 
    document.write(prop + "<br />"); 
} 

impresiones (en Firefox 3.6.3 y Chrome 5.0.375.9):

one 
two 
another 

Además, es posible quiere asegurarse de obtener el tipo de codificación JSON que necesita de json_encode(), como un objeto (utiliza llaves {}) y no una matriz (llaves []). Es posible que deba pasar JSON_FORCE_OBJECT a json_encode() para forzarlo.

  • Editado para aclarar que el enfoque preferido es Array)
  • Editado nuevo (lo siento), como me había pasado por alto el comentario de pcorcoran, que tiene un enlace a un problema en el seguimiento de incidencias de cromo con respecto a este. Baste decir que el orden de las propiedades de un objeto es no confiable.
+0

Ya falla en Opera y Chrome, y el comportamiento en otros lugares puede cambiar a medida que se optimizan los motores JS. No confíe en el orden de Objetos: vaya a la Matriz. – bobince

+0

Parece que funciona en Chrome (5.0.375.9 en Mac OS X). ¿Utiliza una versión diferente o tiene un fragmento de código que podría hacer que Chrome ignore el pedido? Me interesa principalmente desde el punto de vista de la curiosidad. Estoy de acuerdo con usted, el mejor enfoque sería usar una matriz y '.sort()' si es necesario. – awgy

+0

Nevermind-- pasó por alto el comentario de pcorcoran a continuación, vinculándolo al rastreador de problemas de Chromium. – awgy

11

Las matrices de PHP son algo únicas en su propiedad de mantener el orden de inserción. Javascript no tiene matrices asociativas per se. Tiene objetos, que a menudo se usan como matrices asociativas. Estos no garantizan ningún orden de clave particular.

¿Por qué no darles salida como una matriz? Eso tendrá un orden particular. Si desea algún tipo de búsqueda de claves, ¿por qué importa el orden?

+1

Creo que la última vez que lo verifiqué, ecma spec dijo que no estaba ordenado, pero todos los navegadores lo implementaron como ordenado. – goat

+3

Todos los navegadores utilizados para implementar matrices asociativas de objetos como ordenados por edad. Chrome ahora es la excepción. Y dado que ECMA también dice que el orden no necesita ser preservado, es mejor no confiar en el orden. Consulte: http://code.google.com/p/chromium/issues/detail?id=883 para discusión sobre: ​​Chrome. – pcorcoran

Cuestiones relacionadas