【问题标题】:sort multidimensional array by date按日期对多维数组进行排序
【发布时间】:2016-10-31 19:28:40
【问题描述】:

我有这个array:-

array (size=8)
  0 => 
    array (size=2)
      'date' => string '17/05/2016 00:00:00' (length=19)
      'reason' => string 'DNA' (length=3)
  1 => 
    array (size=2)
      'date' => string '10/05/2016 00:00:00' (length=19)
      'reason' => string 'UTA' (length=3)
  2 => 
    array (size=2)
      'date' => string '03/05/2016 00:00:00' (length=19)
      'reason' => string 'DNA' (length=3)
  3 => 
    array (size=2)
      'date' => string '26/04/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  4 => 
    array (size=2)
      'date' => string '31/05/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  5 => 
    array (size=2)
      'date' => string '24/05/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  6 => 
    array (size=2)
      'date' => string '07/06/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  7 => 
    array (size=2)
      'date' => string '14/06/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)

我想按“日期”排序

我尝试了以下两种方法,但结果(下)排序不正确。

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

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

这是“排序”数组

array (size=8)
  0 => 
    array (size=2)
      'date' => string '24/05/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  1 => 
    array (size=2)
      'date' => string '14/06/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  2 => 
    array (size=2)
      'date' => string '31/05/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  3 => 
    array (size=2)
      'date' => string '26/04/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  4 => 
    array (size=2)
      'date' => string '17/05/2016 00:00:00' (length=19)
      'reason' => string 'DNA' (length=3)
  5 => 
    array (size=2)
      'date' => string '03/05/2016 00:00:00' (length=19)
      'reason' => string 'DNA' (length=3)
  6 => 
    array (size=2)
      'date' => string '07/06/2016 00:00:00' (length=19)
      'reason' => string 'true' (length=4)
  7 => 
    array (size=2)
      'date' => string '10/05/2016 00:00:00' (length=19)
      'reason' => string 'UTA' (length=3)

【问题讨论】:

  • 数据是否来自数据库?如果是这样,为什么不先通过mysql排序?
  • First usort() 将不起作用,因为您正在比较字符串,而不是日期。所以你的意思是date_compare 功能不起作用?使用 PHPFiddle 提供示例:sandbox.onlinephpfunctions.com
  • String 24/05/2016 00:00:00 无法转换为日期时间,因为 strtotime 预计月份在前。使用从格式创建 - php.net/manual/en/datetime.createfromformat.php
  • @DarraghEnright - 它不是重复的,因为那是我从中获得第二个功能的地方
  • 数据不是直接来自数据库,在到达这一点之前已经处理过了,所以我不能对查询进行排序谢谢。

标签: php


【解决方案1】:

您需要修改 $course 数组中的日期时间字符串,以使它们以您想要的方式进行比较。

执行此操作的一种(灵活)方法是从您的日期时间字符串创建 DateTime() 对象并进行比较。

关于日期时间的简要说明:标准美国格式 m/d/Y 使用正斜杠,标准欧洲格式 d-m-Y 使用连字符。您的日期时间字符串是两者的混合,使用美国风格的正斜杠和欧洲的日/月/年排序。

因此,在比较之前,您必须采取额外的步骤将每个日期时间字符串解析为有效的 DateTime() 对象。

静态方法DateTime::createFromFormat() 可以在这方面提供帮助。例如,给定一个名为 $course 的数组:

$course = [
    [
        'date' => '17/05/2016 00:00:00',
        'reason' => 'DNA',
    ],
    [
        'date'   => '10/05/2016 00:00:00',
        'reason' => 'UTA',
    ],
    [
        'date'   => '03/05/2016 00:00:00',
        'reason' => 'DNA',
    ],
    [
        'date'   => '26/04/2016 00:00:00',
        'reason' => 'true',
    ],
    [
        'date'   => '31/05/2016 00:00:00',
        'reason' => 'true',
    ],
    [
        'date'   => '24/05/2016 00:00:00',
        'reason' => 'true',
    ],
    [
        'date'   => '07/06/2016 00:00:00',
        'reason' => 'true',
    ],
    [
        'date'   => '14/06/2016 00:00:00',
        'reason' => 'true',
    ],
];

然后您可以使用usort() 应用回调,在比较它们之前将每个比较对象的date 值转换为有效的DateTime() 对象:

usort($course, function ($a, $b) {
    $dateA = DateTime::createFromFormat('d/m/Y H:i:s', $a['date']);
    $dateB = DateTime::createFromFormat('d/m/Y H:i:s', $b['date']);
    // ascending ordering, use `<=` for descending
    return $dateA >= $dateB;
});

print_r($course);

这会产生:

Array
(
    [0] => Array
        (
            [date] => 26/04/2016 00:00:00
            [reason] => true
        )

    [1] => Array
        (
            [date] => 03/05/2016 00:00:00
            [reason] => DNA
        )

    [2] => Array
        (
            [date] => 10/05/2016 00:00:00
            [reason] => UTA
        )

    [3] => Array
        (
            [date] => 17/05/2016 00:00:00
            [reason] => DNA
        )

    [4] => Array
        (
            [date] => 24/05/2016 00:00:00
            [reason] => true
        )

    [5] => Array
        (
            [date] => 31/05/2016 00:00:00
            [reason] => true
        )

    [6] => Array
        (
            [date] => 07/06/2016 00:00:00
            [reason] => true
        )

    [7] => Array
        (
            [date] => 14/06/2016 00:00:00
            [reason] => true
        )

)

如果您的课程数组非常大,那么像上面的示例一样动态创建DateTime 对象可能会有一些开销。 YMMV。在这种情况下,我会考虑先映射数组并为每个条目创建DateTime 对象,然后应用usort()

请注意,对于标准格式的日期时间字符串,例如欧洲 d-m/Y H:i:s、美国 m/d/Y H:i:s 或 IS08601 Y-m-d H:i:s,您可以简单地将日期时间字符串作为第一个值传递给 DateTime 构造函数;例如:

$dt = new DateTime($someStandardFormatDateTimeString);

对早些时候错误的接近投票表示歉意。我现在已经删除了。

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    创建一个新数组并使用索引和unix timestamp 那么它应该是一个简单的asort

    $unix_time = date('Ymdhis', strtotime($datetime ));

    PHP asort

    How do I get a unix timestamp from PHP date time?

    【讨论】:

    • 这并不能真正回答 PO 的问题
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2021-09-19
    相关资源
    最近更新 更多