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

È stato utile?

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']);
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top