按时间戳对数组进行排序?

6

我有一个时间戳数组,格式如下:

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内置的排序函数之一即可。 - Botond Balázs
4个回答

4

不需要过于复杂化,只需使用内置的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中的数组输出示例。 - qwerty
sort() 不会返回一个已排序的数组,它返回的是排序是否成功。请参考:http://php.net/manual/en/function.sort.php。实际上它是*原地排序*,因此您的原始数组将包含正确顺序的值。 - Botond Balázs
是的,我的错。它也没有起作用,因为每个日期都放置在数组中的 [show_date] 中。我已经让它工作了,谢谢! :) - qwerty
它有效吗?我刚刚看到你对问题所做的编辑,似乎你需要使用usort() - Botond Balázs
如果时间戳是多维数组的一部分,这仍然可以完成吗? - tmyie

1

您可以使用PHP标准排序来对其进行排序。请参见数组排序

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中的数组输出示例。 - qwerty
看看 asortsort。"成功时返回 TRUE,失败时返回 FALSE",这没有什么意外的。 - Olaf Dietsche
@qwerty,请看我的修改后答案。 - Olaf Dietsche
你的解决方案可能有效,但我通过循环遍历数组并获取每个值($array[x]['show_date'] = value),然后将其放入新数组($array[x] = value)中来解决它,然后将新数组复制到旧数组中并重置临时数组。然后我只是使用了sort(),这很好用。谢谢! - qwerty

0

您不需要日期格式来传递特定的日期。当您传递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
@qwerty 不,冒泡排序是较慢的算法之一。要进行比较,请看这里 排序算法 - Olaf Dietsche
您可以利用内置的排序函数。请参见此帖子的编辑中的解决方案。 - banzsh
这个很好用,但你甚至不需要调用 strtotime() - 参见我的答案。 - Botond Balázs

0

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