2009-02-28 20 views
17

tengo una matriz en este formato:Cómo ordenar una matriz fecha en 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' 
     ) 

) 

Quiero ordenar a cabo en el orden ascendente de las fechas (basado en el mes, día y año) . ¿Cuál es la mejor manera de hacer eso?

Originalmente, los correos electrónicos se han recuperado en el formato de fecha MySQL, por lo que es posible para mí para obtener la matriz en este estado:

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

Tal vez cuando su en este formato, que puede recorrer a través de ellos, eliminar todas las marcas '-' (guion), por lo que se dejan como integars, ordénelas usando array_sort() y vuelva a recorrerlas para ordenarlas? Preferiría si hubiera otra forma, ya que estaría haciendo 3 bucles con esto por usuario.

Gracias.

Editar: Yo también podría hacer esto:

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

Pero el uso de esto, habría alguna manera de ordenar la matriz basada en el elemento 'db' solo?

Edición 2: Actualización var_dump inicial formato

+2

¿Puede usar var_dump() en sus datos en lugar de crear su propio formato? Al menos, cuando su propio formato es tan ambiguo y engañoso como lo que publicó aquí. ;-) – Tomalak

Respuesta

40

Uso de la ISO (yyyy-mm-dd) en lugar del formato "Inglés", y luego sólo tiene que utilizar la función ksort para conseguir que en el orden correcto.

No hay necesidad de quitar los guiones, ksort va a hacer una comparación alfanumérica sobre las claves de cadena, y el formato yyyy-mm-dd funciona perfectamente así como el orden léxico es el mismo que el orden de la fecha real.

EDIT Veo que ahora ha corregido su pregunta para mostrar que en realidad tiene una matriz de matrices, y que la clave de clasificación está en las matrices secundarias. En este caso, se debe utilizar uksort como se recomienda en otros lugares, pero recomendaría que vaya con su propia edición y ordenación en función de la fecha DB formato, en lugar de mediante el análisis del formato legible por humanos:

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'); 

Creo que es mejor utilizar la función usort() en lugar de uksort(), porque a veces no se pueden usar variables globales y, de todos modos, el uso de variables globales tampoco es una buena práctica.

10

En realidad, utilice esto:

usort($array, "cmp"); 

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

:)

+0

Esto funcionó para mí. Gracias. –

2

También es posible usar la función anónima.

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

Esta respuesta es básicamente la misma que la de las respuestas anteriores – Machavity

+1

Está utilizando la función anónima, mientras que otras no. –