2009-02-28 6 views
17

Ho un array in questo formato:Come ordinare un array di data in PHP

Array 
(
    [0] => Array 
     (
      [28th February, 2009] => 'bla' 
     ) 

    [1] => Array 
     (
      [19th March, 2009] => 'bla' 
     ) 

    [2] => Array 
     (
      [5th April, 2009] => 'bla' 
     ) 

    [3] => Array 
     (
      [19th April, 2009] => 'bla' 
     ) 

    [4] => Array 
     (
      [2nd May, 2009] => 'bla' 
     ) 

) 

Voglio ordinarli in ordine crescente delle date (sulla base del mese, giorno e anno) . Qual è il modo migliore per farlo?

In origine le e-mail vengono recuperati nel formato data MySQL, per cui il suo possibile per me per ottenere la matrice in questo stato:

Array 
[ 
    ['2008-02-28']='some text', 
    ['2008-03-06']='some text' 
] 

Forse, quando la sua in questo formato, posso ciclo attraverso di loro, rimuovere tutti i contrassegni '-' (trattino) in modo che vengano lasciati come numeri interi, li ordinano usando array_sort() e passano nuovamente attraverso di essi per ordinarli? Preferirei se ci fosse un altro modo come farei 3 loop con questo per utente.

Grazie.

Edit: avrei potuto anche fare questo:

$array[$index]=array('human'=>'28 Feb, 2009', 
        'db'=>'20080228', 
        'description'=>'Some text here'); 

Ma usando questo, ci sarebbe un modo per ordinare l'array in base all'elemento 'db' da sola?

Edit 2: Aggiornamento var_dump iniziale formato

+2

Puoi usare var_dump() sui tuoi dati invece di creare il tuo formato? Almeno quando il tuo formato è ambiguo e fuorviante come quello che hai postato qui. ;-) – Tomalak

risposta

40

Utilizzare l'ISO (yyyy-mm-dd), piuttosto che il formato "inglese", e poi basta usare la funzione ksort per farli nel giusto ordine.

Non è necessario rimuovere i trattini, ksort eseguirà un confronto alfanumerico sui tasti delle stringhe e il formato yyyy-mm-dd funziona perfettamente in quanto l'ordine lessicale è uguale all'effettivo ordine di data.

EDIT Vedo che ora hai corretto la domanda per mostrare che in realtà hai una matrice di array e che la chiave di ordinamento è nei sotto-array. In questo caso, è necessario utilizzare uksort come raccomandato altrove, ma io vi consiglio di andare con il proprio modificare e ordinare in base alla data DB formattato, piuttosto che analizzando il formato leggibile:

function cmp($a, $b) 
{ 
    global $array; 
    return strcmp($array[$a]['db'], $array[$b]['db']); 
} 

uksort($array, 'cmp'); 
4
function cmp($a, $b) {  
    global $array;  
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}  
uksort($array, 'cmp'); 

Penso che sia meglio usare la funzione usort() invece di uksort(), perché a volte non è possibile utilizzare le variabili globali e comunque utilizzare le variabili globali non è una buona pratica.

10

In realtà, utilizzare questo:

usort($array, "cmp"); 

function cmp($a, $b){ 
    return strcmp($b['db'], $a['db']); 
} 

:)

+0

Questo ha funzionato per me. Grazie. –

2

Si potrebbe anche usare la funzione anonima.

// Sort in chronological order. 
usort($array, function($a, $b) { 
    return strcmp($a['db'], $b['db']); 
}); 
+1

Questa risposta è fondamentalmente la stessa delle precedenti risposte – Machavity

+1

Sta usando la funzione anonima dove gli altri no. –