如何按名称/时间戳排序多维数组?

时间:2017-08-13 17:10:50

标签: php arrays sorting

当数组只包含一个时间戳并且不是多维时,我使用“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
        )

)

3 个答案:

答案 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']);
});

Live demo

这将轻松胜过array_multisort因为它不需要PHP首先将timestamp提取到单独的列数组中,然后执行multisort(比我的简单比较器函数更复杂的函数)在它上面。