Come ordinare un array di data in PHP
-
11-09-2019 - |
Domanda
Ho un array in questo formato:
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 segni '-'
(trattino) in modo che siano lasciati come integars, ordinarli utilizzando array_sort()
e passante attraverso di loro ancora una volta per ordinare loro? Preferirei se ci fosse un altro modo, come avrei fatto 3 anelli 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?
Modifica 2: Aggiornamento var_dump iniziale
Soluzione
Utilizzare il formato ISO (yyyy-mm-dd
), piuttosto che il formato "inglese", e poi basta usare il ksort
funzione per farli nel giusto ordine.
Non c'è bisogno di rimuovere i trattini, ksort
farà un confronto alfanumerico sui tasti di stringa, e il formato yyyy-mm-dd
funziona perfettamente così come l'ordine lessicale è lo stesso che l'ordine di data effettiva.
Modifica Vedo che hai ora corretto la tua domanda per dimostrare che hai effettivamente avuto un array di array, e che la chiave di ordinamento è nelle sub-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');
Altri suggerimenti
In realtà, utilizzare questo:
usort($array, "cmp");
function cmp($a, $b){
return strcmp($b['db'], $a['db']);
}
:)
function cmp($a, $b) {
global $array;
return strcmp($array[$a]['db'], $array[$b]['db']);
}
uksort($array, 'cmp');
Credo che ci sia meglio utilizzare la funzione usort()
invece di uksort()
, perché a volte si può `t utilizzare le variabili globali a tutti e in ogni caso l'utilizzo di variabili globali non è una buona pratica sia.
È anche possibile utilizzare la funzione anonima.
// Sort in chronological order.
usort($array, function($a, $b) {
return strcmp($a['db'], $b['db']);
});