当数组只包含一个时间戳并且不是多维时,我使用“rsort”函数对时间戳进行排序。
所以现在问题是我如何处理这个问题?
该数组看起来类似于此
Array
(
[0] => Array
(
[type] => post
[id] => 1
[timestamp] => 2017-08-12 21:03:22
[poster] => 1
[profile] => 1
[post] => Testtttttinngggs
)
[1] => Array
(
[type] => post
[id] => 2
[timestamp] => 2017-08-12 21:03:18
[poster] => 1
[profile] => 5
[post] => Hello you
)
[2] => Array
(
[type] => post
[id] => 3
[timestamp] => 2017-08-12 21:03:33
[poster] => 1
[profile] => 1
[post] => Somesay timestamp is screwed
)
[3] => Array
(
[type] => post
[id] => 4
[timestamp] => 2017-08-12 21:28:54
[poster] => 1
[profile] => 1
[post] => This is truely a teeest
)
[4] => Array
(
[type] => post
[id] => 5
[timestamp] => 2017-08-13 15:04:34
[poster] => 1
[profile] => 1
[post] => Test test test test
)
)
答案 0 :(得分:7)
您可以使用 array_multisort
SET DATEFIRST 1
答案 1 :(得分:1)
您可以使用usort
usort($array, function($a, $b)
{
if($a['timestamp']>$b['timestamp'])
{
return -1;
}
elseif($a['timestamp']<$b['timestamp'])
{
return 1;
}
return 0;
});
答案 2 :(得分:1)
我错了。 Axalix的答案比我和Rob Ruchte的答案要快得多。我的测试:
$data = [
['timestamp'=> '2015-08-12', 'id'=>1],
['timestamp'=> '2017-07-13', 'id'=>2],
['timestamp'=> '2017-01-12', 'id'=>3],
];
function useUsort($data){
usort($data,function($a,$b) {
return strtotime($b['timestamp']) - strtotime($a['timestamp']);
});
};
function useMultisort($data){
array_multisort(array_column($data, 'timestamp'), SORT_DESC, $data);
};
$start = microtime(true);
for($i=1;$i<=100000;$i++) useUsort($data);
$t1 = microtime(true);
for($i=1;$i<=100000;$i++) useMultisort($data);
$t2 = microtime(true);
echo "usort: ". round(($t1 - $start) * 1000) . " ms\n";
echo "array_multisort: ". round(($t2 - $t1) * 1000) . " ms\n";
我的结果:
usort: 2262 ms
array_multisort: 246 ms
@Axalix的答案很好,但我会采取不同的方法。因为您只关心按一个字段排序(时间戳),array_multisort
是过度的,因为它设计为按多个字段排序。我愿意:
usort($data,function($a,$b) {
return strtotime($b['timestamp']) - strtotime($a['timestamp']);
});
这将轻松胜过array_multisort
因为它不需要PHP首先将timestamp
提取到单独的列数组中,然后执行multisort(比我的简单比较器函数更复杂的函数)在它上面。