如何按时间戳对PHP多维数组排序
我目前正在搞乱Twitter API,但这个问题实际上与Twitter API无关;这只是一个普通的PHP问题 我将分别提取几个tweet查询,然后将请求合并在一起。因此,基本上,我最终得到了一个最终的数组,在它的结尾,tweet不一定按正确的时间顺序排列:如何按时间戳对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'
$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,哎呀,我没有注意到您在问题中指定了降序。是的,这是解决问题的正确方法。我会更新我的答案以备将来参考。