如何按时间戳对PHP多维数组进行排序

时间:2013-06-22 02:35:19

标签: php sorting

我目前正忙着使用Twitter API,但这个问题与Twitter API并没有关系;这只是一个普通的PHP问题。

我分别对推文进行了几次查询,然后将这些请求合并在一起。所以,基本上,我最后会得到一个类似于此类的最终数组,其中推文不一定按照正确的时间顺序排列:

$tweets = array(
    array(
        'text'  => 'Some tweet.',
        'time'  => 'Sat Jun 22 00:45:37 +0000 2013'
    ),
    array(
        'text'  => 'And another.',
        'time'  => 'Fri Jun 21 15:32:34 +0000 2013'
    ),
    array(
        'text'  => 'Another tweet.',
        'time'  => 'Fri Jun 21 17:24:44 +0000 2013'
    ),
    array(
        'text'  => 'And one more tweet.',
        'time'  => 'Fri Jun 21 08:01:37 +0000 2013'
    )
);

现在我只想弄清楚按每个推文的时间戳排序这个数组的最佳方法是降序。

我正在阅读usortuasort,但我不仅仅是对它们的理解,以及它们如何对应于使用此时间戳作为比较。所以任何帮助都会非常感激。提前谢谢!

2 个答案:

答案 0 :(得分:9)

这个问题有两个部分。

首先,你需要一种方法来比较两次 - 给定格式的时间的直接字符串比较不会给你任何有用的信息。您可以使用strtotime()将字符串转换为几秒钟的unix时间戳 - 这样您就可以轻松进行比较。

$ts = strtotime($item['time']);

第二部分实际上是对数组进行排序。您可以使用usort()和这样的回调函数来执行此操作:

function do_compare($item1, $item2) {
    $ts1 = strtotime($item1['time']);
    $ts2 = strtotime($item2['time']);
    return $ts2 - $ts1;
}
usort($tweets, 'do_compare');
// items in $tweets are now sorted by time
每次需要比较两个元素时,

usort()通过调用您的函数(命名或匿名)来工作。如果第一项是第一项,则函数需要返回小于零的数字,如果项目相等则返回零,如果第一项第二项,则返回大于零。在您的示例中,我们只是从第二个时间戳中减去第一个时间戳来获取此值(如果第一个项目更大,则结果将为负数,将其放在第一位 - 降序排序)。实际的数值并不重要 - 只要它是否小于,等于或大于零。

另一种不需要命名功能的方法是使用closure - 或anonymous function。 这看起来像这样:

usort($tweets, function($item1, $item2) {
    $ts1 = strtotime($item1['time']);
    $ts2 = strtotime($item2['time']);
    return $ts2 - $ts1;
});
// items in $tweets are now sorted by time

这与第一个解决方案基本相同,只是我们定义内联函数而不是引用之前已定义的函数名称。

答案 1 :(得分:0)

使用array_multisort

// Obtain a list of columns
 foreach ($tweets as $key => $row) {
    $text[$key]  = $row['text'];
    $time[$key] = strtotime($row['time']);
}

array_multisort($time, SORT_DESC);