Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按时间戳对PHP多维数组排序_Php_Sorting - Fatal编程技术网

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

如何按时间戳对PHP多维数组排序,php,sorting,Php,Sorting,我目前正在搞乱Twitter API,但这个问题实际上与Twitter API无关;这只是一个普通的PHP问题 我将分别提取几个tweet查询,然后将请求合并在一起。因此,基本上,我最终得到了一个最终的数组,在它的结尾,tweet不一定按正确的时间顺序排列: $tweets = array( array( 'text' => 'Some tweet.', 'time' => 'Sat Jun 22 00:45:37 +0000 2013'

我目前正在搞乱Twitter API,但这个问题实际上与Twitter API无关;这只是一个普通的PHP问题

我将分别提取几个tweet查询,然后将请求合并在一起。因此,基本上,我最终得到了一个最终的数组,在它的结尾,tweet不一定按正确的时间顺序排列:

$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'
    )
);
现在我只是想弄清楚,按每条Tweet的时间戳对数组进行排序的最佳方法是什么,按降序排列

我正在阅读有关
usort
uasort
的内容,但我不仅对它们有相当的了解,还不了解它们如何与使用此时间戳进行比较相对应。所以这里的任何帮助都将非常感谢。提前谢谢

使用


这个问题有两个部分

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

$ts = strtotime($item['time']);
第二部分实际上是对数组进行排序。您可以使用和回调函数这样做:

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($tweets, function($item1, $item2) {
    $ts1 = strtotime($item1['time']);
    $ts2 = strtotime($item2['time']);
    return $ts2 - $ts1;
});
// items in $tweets are now sorted by 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($tweets, function($item1, $item2) {
    $ts1 = strtotime($item1['time']);
    $ts2 = strtotime($item2['time']);
    return $ts2 - $ts1;
});
// items in $tweets are now sorted by time

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

您不也需要
$text
吗?另外,您将如何将数组重新组装成他开始使用的格式?我认为您尝试的是像php文档示例一样,需要数组\u multisort($time,SORT\u DESC,$text,SORT\u ASC,$tweets);非常感谢你的解释。这真是太完美了,但对我来说,结果是推特上升了。我刚刚将返回值翻转到
返回$ts2-$ts1
——似乎就是这样。@Jason,哎呀,我没有注意到您在问题中指定了降序。是的,这是解决问题的正确方法。我会更新我的答案以备将来参考。