2011-03-24 5 views
1

Je tri d'un tableau comme:php mauvais tri du tableau de résultat par date

function date_compare($a, $b) 
{ 
    $t1 = strtotime($a['date']); 
    $t2 = strtotime($b['date']); 
    return $t1 - $t2; 
}  
usort($array, 'date_compare'); 

Cependant, comme vous pouvez voir la sortie ci-dessous, les dates ne sont pas triées. Une idée pourquoi? Merci

Array 
(
    [0] => Array 
     (
      [id] => 16870 
      [date] => Tue, 22 Mar 2011 13:12:19 +1100 
      [bar] => Foo 
     ) 

    [1] => Array 
     (
      [id] => 16871 
      [bar] => foo 
      [date] => Mon, 21 Mar 2011 23:06:32 -0500 (CDT) 
     ) 

    [2] => Array 
     (
      [id] => 16872 
      [bar] => foo 
      [date] => Tue, 22 Mar 2011 00:37:01 -0500 (CDT) 
     ) 
} 
+0

Je suppose que les dates sont définitivement triées, mais que 'strtotime' ne retourne pas ce que vous attendez de lui. – Jon

Répondre

0

Comme d'autres l'ont souligné, les dates sont triées correctement. Vous voudrez peut-être faire quelque chose comme:

foreach ($dates as $i => $date) 
{ 
    $dates[$i]['ts'] = strtotime($date['date']); 
    $dates[$i]['date'] = date('Y-m-d H:i:s', $dates[$i]['ts']); 
} 

usort($dates, function($a, $b) { return $a['ts'] - $b['ts']; }); 

Ici je crée une propriété ts pour chaque jour afin strtotime() n'a pas besoin d'être appelé deux fois par comparaison de tri. Deuxièmement, je change la date pour être dans le fuseau horaire local. Vous pouvez ajuster la chaîne de format comme vous voulez.

Alternativement, vous pouvez simplement unset() la composante date du tableau et appelez directement date() sur le composant ts lorsque vous souhaitez imprimer.

4

Ils sont classés très bien si vous prenez le fuseau horaire en compte, ce qui strtotime fait.

+0

C'est tout à fait vrai. Je n'ai pas réalisé ça. Quel serait un bon moyen d'enlever le fuseau horaire de celui-ci? – Kyle

+0

Oui, j'allais juste dire que ça pourrait être ça. Testé et vérifié c'est ce que ça fait. – Matt