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

Jas*_*son 5 php sorting

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

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

$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'
    )
);
Run Code Online (Sandbox Code Playgroud)

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

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

jcs*_*nyi 9

这个问题分为两个部分.

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

$ts = strtotime($item['time']);
Run Code Online (Sandbox Code Playgroud)

第二部分实际上是对数组进行排序.您可以使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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