PHP如何根据日期对数组进行排序?

45

可能是重复问题:
如何按包含日期的元素排序PHP多维数组

我有一个 PHP 数组,其中包含来自 XML 或 JSON 的数据,看起来像这样:

[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"
}

我想做的是按日期对这两个项目进行排序。

  1. 当排序值位于每个项目内部时,是否可以按日期排序?
  2. 我需要将日期格式转换为时间戳吗?

我不想这样做

我可以使用日期并将其设置为ID,但感觉不太合适,因为两个项目可以具有相同的日期,这样就不会是唯一的。


请查看此帖子中的第一个答案:链接 - Sander
4个回答

116

在排序之前,您不需要将日期转换为时间戳,但这是一个好主意,因为如果没有此步骤,则排序需要更长时间。

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

更新

在较新的PHP版本中,您也可以使用箭头函数。这里是上述内容更加简洁的版本:

usort($data, fn ($a, $b) => strtotime($a["date"]) - strtotime($b["date"]));

干净的答案,但如果两个日期相等,这将丢失值。 - Mojo Allmighty
1
这不是真的,为什么会呢?它们只是简单地一个接一个地执行。 - KARASZI István
我该如何进行降序排序? - Will
将减法操作数翻转,从$b["date"]改为$a["value"] - KARASZI István

43

使用usort函数:

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

1
这个版本怎么样?usort($sortArray, function ($a, $b) { return strcmp($a['article_created_date'], $b['article_created_date']); }); - Guchelkaben

29

我建议使用DateTime对象而不是字符串,因为您无法轻松比较字符串,而这对于排序是必需的。此外,使用日期进行工作还可以获得其他优势。

一旦您有了DateTime对象,排序就非常简单:

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

-2
他正在考虑以日期为键,但担心值会叠加在一起,我想展示的是他仍然可以保持值的完整性,而不是叠加在一起,这样可以吗?!
<?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);
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接