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

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的资料,但我并不完全理解它们,以及如何将它们与使用此时间戳进行比较相对应。因此,在这里任何帮助都将不胜感激。提前致谢!

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

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

非常感谢您的解释。这很完美,只是对我来说推文是倒序的。我只需将返回值翻转为 return $ts2-$ts1 -- 就可以了。 - Jason
@Jason 哎呀,我没有注意到你在问题中指定了降序。是的,那是正确的修复方式。我会更新我的答案以供参考。 - jcsanyi

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);

你不需要在那里加上$text吗?另外,你如何将数组重新组合成他最初的格式? - jcsanyi
我认为你尝试的是像 PHP 文档示例 http://php.net/manual/en/function.array-multisort.php#example-4883 中所展示的一样,需要使用 array_multisort($time, SORT_DESC, $text, SORT_ASC, $tweets)。 - tristanbailey

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