2011-06-19 13 views
21

Duplicar posible:
PHP Sort a multidimensional array by element containing dateorden PHP orden por fecha?

tengo algunos datos de XML o JSON en una matriz PHP que tiene este aspecto:

[0]= array(2) { 
    ["title"]= string(38) "Another title" 
    ["date"]= string(31) "Fri, 17 Jun 2011 08:55:57 +0200" 
} 
[1]= array(2) { 
    ["title"]= string(38) "My title" 
    ["date"]= string(31) "Mon, 16 Jun 2010 06:55:57 +0200" 
} 

Lo que yo quiero hacer es ordenar los dos elementos por fecha.

  1. ¿Es posible ordenar por fecha, cuando el valor de clasificación está dentro de cada elemento?
  2. ¿Debo convertir el formato de fecha en fecha y hora?

Lo que no quieren hacer

que podría utilizar la fecha y establecerlo como el ID, pero que no se siente bien, porque dos elementos pueden tener la misma fecha y entonces sería no ser único

+0

Echa un vistazo a la primera respuesta en este post: [link] (http://stackoverflow.com/questions/597863/how-to-sort-a-date-array-in-php) – Sander

Respuesta

65

No es necesario para convertir la fecha para fecha y hora antes de la clasificación, pero es una buena idea, porque aunque se necesitará más tiempo para ordenar sin ella.

$data = array(
    array(
     "title" => "Another title", 
     "date" => "Fri, 17 Jun 2011 08:55:57 +0200" 
    ), 
    array(
     "title" => "My title", 
     "date" => "Mon, 16 Jun 2010 06:55:57 +0200" 
    ) 
); 

function sortFunction($a, $b) { 
    return strtotime($a["date"]) - strtotime($b["date"]); 
} 
usort($data, "sortFunction"); 
var_dump($data); 
+0

muy directa, la respuesta limpia . Gracias. – Kray

+0

Respuesta limpia, pero esto perderá valores si dos fechas son iguales –

+0

Eso no es cierto, ¿por qué lo haría? Simplemente simplemente uno después del otro. –

26

Uso usort:

usort($array, function($a1, $a2) { 
    $v1 = strtotime($a1['date']); 
    $v2 = strtotime($a2['date']); 
    return $v1 - $v2; // $v2 - $v1 to reverse direction 
}); 
+0

¿Qué hay de esta versión? 'usort ($ sortArray, la función ($ a, $ b) { retorno strcmp ($ a [ 'article_created_date'], $ b [ 'article_created_date']); });' – DrMed

16

recomiendo el uso de DateTime objetos en lugar de cadenas, porque no se puede comparar fácilmente las cadenas, que se requiere para la clasificación. También obtienes ventajas adicionales por trabajar con fechas.

Una vez que tenga los objetos DateTime, la clasificación es bastante fácil:

usort($array, function($a, $b) { 
    return ($a['date'] < $b['date']) ? -1 : 1; 
}); 
-2

Estaba considerando que tiene la fecha como una llave, pero preocupado de que los valores serán escritos uno por encima de otro, todo lo que quería mostrar (tal vez no tan obvio, por eso edito) es que todavía puede tener valores intactos, no escritos uno encima del otro, ¿no es así?

<?php 
$data['may_1_2002']= 
Array(
'title_id_32'=>'Good morning', 
'title_id_21'=>'Blue sky', 
'title_id_3'=>'Summer', 
'date'=>'1 May 2002' 
); 

$data['may_2_2002']= 
Array(
'title_id_34'=>'Leaves', 
'title_id_20'=>'Old times', 
    'date'=>'2 May 2002 ' 
); 


echo '<pre>'; 
print_r($data); 
?>