2010-04-22 4 views
5

In PHP sto eseguendo un mysql_query con una clausola ORDER BY. Sto quindi iterando attraverso i risultati per costruire un array associativo, con row_id come chiave.L'ordine della mia matrice associativa verrà mantenuto da PHP a Javascript?

Quindi, sto chiamando json_encode su tale array e sta emettendo il risultato.

Questa pagina viene caricata con AJAX e definita in una variabile Javascript. Quando eseguirò l'iterazione attraverso quella variabile Javascript, avrò ancora l'ordine che è stato restituito da mysql_query?

risposta

5

Quello che dice il cletus è corretto, ma nella mia esperienza, la maggior parte dei browser manterrà l'ordine. Detto questo, dovresti prendere in considerazione l'utilizzo di Array. Se avete bisogno di risolvere una volta che si riceve sul lato client, basta usare la funzione .sort() in JavaScript:

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

Anche se sembra che funziona, l'ordine di immobili a un oggetto non può essere conteggiato sopra. Vedi i molti commenti sotto per maggiori informazioni (occhi più intelligenti dei miei). Tuttavia, questo era il codice che ho usato per testare il comportamento nel mio test limitata:

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

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

Stampe (in Firefox 3.6.3 e Chrome 5.0.375.9):

one 
two 
another 

Inoltre, si può vuoi essere sicuro di ottenere il tipo di codifica JSON di cui hai bisogno dal json_encode(), ad esempio un oggetto (utilizza parentesi graffe {}) e non un array (parentesi graffe []). Potrebbe essere necessario passare JSON_FORCE_OBJECT a json_encode() per forzarlo.

  • cura per chiarire che l'approccio Array è preferito)
  • A cura di nuovo (mi dispiace), come avevo trascurato il commento di pcorcoran, che ha un collegamento ad un problema in di Chromium issue tracker per quanto riguarda questo. Basti dire che l'ordine di proprietà di un oggetto è non affidabile.
+0

Già fallito su Opera e Chrome, e il comportamento altrove potrebbe cambiare in quanto i motori JS continuano ad essere ottimizzati. Non fare affidamento sull'ordine dell'oggetto: vai per la matrice. – bobince

+0

Sembra funzionare per me in Chrome (5.0.375.9 su Mac OS X). Stai utilizzando una versione diversa o hai uno snippet di codice che potrebbe causare la mancata esecuzione dell'ordine da parte di Chrome? Sono per lo più interessato solo da una curiosità. Sono d'accordo con te, l'approccio migliore sarebbe usare un array e '.sort()' se necessario. – awgy

+0

Nevermind-- ha trascurato il commento di pcorcoran qui sotto, che rimanda al tracker dei problemi di Chromium. – awgy

11

Gli array PHP sono in qualche modo unici nella loro proprietà di mantenere l'ordine di inserimento. Javascript non ha array associativi di per sé. Ha oggetti, che sono spesso usati come array associativi. Questi non garantiscono alcun ordine particolare della chiave.

Perché non inviarli come array? Questo avrà un ordine particolare. Se vuoi qualche tipo di ricerca chiave perché l'ordine è importante?

+1

Penso che l'ultima volta che ho controllato, ecma spec ha detto che non era ordinato, ma tutti i browser li hanno implementati come ordinati. – goat

+3

Tutti i browser utilizzati per implementare gli array associativi di oggetti ordinati per età. Chrome è ora l'eccezione. E poiché l'ECMA dice anche che l'ordine non deve essere preservato, è meglio non fare affidamento sull'ordine. Vedere: http://code.google.com/p/chromium/issues/detail?id=883 per discussioni su: Chrome. – pcorcoran

Problemi correlati