6

我目前正在搞乱 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但我不只是完全理解它们,以及它们如何对应于使用这个时间戳作为比较。因此,这里的任何帮助将不胜感激。提前致谢!

4

2 回答 2

10

这个问题有两个部分。

首先,您需要一种比较两次的方法 - 以给定格式对时间进行直接字符串比较不会给您任何有用的信息。您可以使用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()通过每次需要比较两个元素时调用您的函数(命名或匿名)来工作。如果第一项在前,您的函数需要返回一个小于零的数字,如果两项相等则返回零,或者如果第一项在后,则返回大于零的数字。在您的示例中,我们只是从第二个时间戳中减去第一个时间戳以获得此值(如果第一项更大,则结果将为负数,将其放在首位 - 降序排序)。实际数值无关紧要 - 只是它是否小于、等于或大于零。

另一种不需要命名函数的方法是使用闭包匿名函数
看起来像这样:

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

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

于 2013-06-22T02:59:27.147 回答
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);
于 2013-06-22T02:40:36.950 回答