【问题标题】:Sort array with timestamps?使用时间戳对数组进行排序?
【发布时间】:2012-11-20 09:17:06
【问题描述】:

我有一个如下所示的时间戳数组:

2012-11-19 19:45

我需要按日期对它们进行排序。如果我可以获得日期的 unix 时间戳,我可以进行冒泡排序或其他操作,但我不知道是什么函数给了我这个。我查看了 strtotime 但它不会让我通过日期格式。我也不确定冒泡排序是最好的方法。

有什么建议吗?

数组示例:

另外,对不起,我应该提到它在“show_date”中。

Array
(
    [15] => Array
        (
            [show_date] => 2012-11-19 10:40
        )

    [16] => Array
        (
            [show_date] => 2012-11-20 10:40
        )

    [17] => Array
        (
            [show_date] => 2012-11-21 10:40
        )

    [18] => Array
        (
            [show_date] => 2012-11-22 10:40
        )

)

【问题讨论】:

  • 您不需要编写冒泡排序(这是效率最低的排序算法之一)。只需使用 PHP 的内置排序功能之一。

标签: php arrays date sorting timestamp


【解决方案1】:

无需过于复杂。只需使用内置的sort 函数:

sort($timestamp_array);

您不需要转换为 UNIX 时间戳,因为字符串采用标准的“ISO 可排序日期”格式。这意味着如果您对字符串进行排序,日期将是正确的顺序。

这是一个 php -a 会话,展示了它的工作原理:

php > $ts = array('1986-01-31 12:11', '2012-01-01 13:12', '1980-10-10 12:00');
php > sort($ts);
php > echo var_export($ts);
array (
  0 => '1980-10-10 12:00',
  1 => '1986-01-31 12:11',
  2 => '2012-01-01 13:12',
)

【讨论】:

  • asort() 和 sort() 只是出于某种原因返回 true。有任何想法吗?有关数组输出示例,请参见 OP。
  • sort() 不返回排序后的数组,而是返回排序是否成功。请参阅:php.net/manual/en/function.sort.php。它会对数组进行排序,因此您的原始数组将包含正确顺序的值。
  • 是的,我的错。它也不起作用,因为每个日期都放在数组的 [show_date] 中。我搞定了,谢谢! :)
  • 成功了吗?我刚刚看到您对问题所做的编辑,看来您需要使用usort()
  • 如果时间戳是多维数组的一部分,还可以这样做吗?
【解决方案2】:

您可以使用 PHP 标准排序对其进行排序。见Sorting Arrays

asort($timestamps);

对于你的例子,你可以定义一个比较函数

function cmp_show_date($a, $b)
{
    if ($a['show_date'] == $b['show_date']) {
        return 0;
    }

    return ($a['show_date'] < $b['show_date']) ? -1 : 1;
}

并在usort中使用它

usort($timestamps, 'cmp_show_date');

【讨论】:

  • asort() 和 sort() 只是出于某种原因返回 true。有任何想法吗?有关数组输出示例,请参见 OP。
  • 查看asortsort。 “成功时返回 TRUE,失败时返回 FALSE。”所以,这并不奇怪。
  • @qwerty 看看我修改后的答案。
  • 您的解决方案可能会起作用,但我通过遍历数组并获取每个值 ($array[x]['show_date'] = value) 并将其放入新数组 ($array[x] = value) 来解决它,然后将新数组复制到旧的并重置临时的。然后我只使用了 sort() 效果很好。谢谢!
【解决方案3】:

您可以使用usort() 和strtotime 的组合,但我更愿意使用DateTime 类及其getTimestamp 方法,因为它可以处理时区和多种格式。

【讨论】:

    【解决方案4】:

    您不需要日期格式来传递该特定日期。当您传递strtotime('2012-11-19 19:45'); 时,它将返回 UNIX 时间戳。

    编辑:

    $arr = array();
    foreach ($dates as $k => $v) {
        $arr[$k]  = strtotime($v['date']);//or $k if your date is the index
    }
    
    array_multisort($arr, SORT_ASC, $dates);
    

    【讨论】:

    • 那么冒泡排序是最好最简单的方法吗?
    • @qwerty 不,冒泡排序是较慢的算法之一。比较看这里Sorting algorithm
    • 您可以利用内置函数进行排序。在这篇文章的编辑中查看解决方案
    • 这很好用,但你甚至不需要打电话给strtotime() - 查看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2020-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多