【问题标题】:PHP order array by date? [duplicate]PHP按日期排序数组? [复制]
【发布时间】:2011-09-18 02:32:29
【问题描述】:

可能重复:
PHP Sort a multidimensional array by element containing date

我在一个 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,但这感觉不对,因为两个项目可以具有相同的日期,然后它就不会是唯一的。

【问题讨论】:

  • 看看这篇文章的第一个答案:link

标签: php arrays datetime sorting date


【解决方案1】:

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

$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 版本中,您也可以使用 arrow functions。在这里您可以找到上述内容的更简洁版本:

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

【讨论】:

  • 非常直接、干净的答案。谢谢。
  • 干净的答案,但如果两个日期相等,这将丢失值
  • 这不是真的,为什么会这样?他们只会紧随其后。
【解决方案2】:

使用usort:

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

【讨论】:

  • 这个版本怎么样? usort($sortArray, function ($a, $b) { return strcmp($a['article_created_date'], $b['article_created_date']); });
【解决方案3】:

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

一旦有了 DateTime 对象,排序就很容易了:

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

【讨论】:

    【解决方案4】:

    他正在考虑将日期作为键,但担心值会被写在另一个之上,我只想展示(也许不是那么明显,我为什么要编辑)是他仍然可以保持完整的值,不写在上面,这样不行吗?!

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

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多