在两个键上排序php multidimesional数组:1个升序,1个自定义

时间:2016-06-15 11:04:31

标签: php arrays sorting multidimensional-array

给出一个像这样的多维数组:

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'),
[1] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap'),
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'),
[3] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap')
);

如何对此数组进行排序以获得此结果:

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'),
[1] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap'),
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'),
[3] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap')
);

排序首先在aDate按升序排序,第二种排序为tType按照以下顺序自定义排序:已添加,RtrnCap,已删除。

我使用多{type} this SO question等“多键”搜索解决方案,并使用this SO question这样的usort(使用匿名函数)自定义排序一个键。这些只是解决方案的一半。 TWO排序示例使用正常的升序或降序排序顺序(我需要一个是自定义顺序)。自定义的usort示例工作正常,但它只有一组值。

底线:我需要两种排序:第一种是日期升序,第二种是自定义。

1 个答案:

答案 0 :(得分:0)

$typeSort = function($a, $b) {
    if ($a['tType'] == $b['tType']) {
        return 0;
    }

    $priority = array('Added' => 0, 'RtrnCap' => 1, 'Removed' => 2);
    return ($priority[$a['tType']] < $priority[$b['tType']]) ? -1 : 1;
};

usort($data, function ($a, $b) use ($typeSort) {
    if ($a['aDate'] == $b['aDate']) {
        return $typeSort($a, $b);
    }

    return ($a['aDate'] < $b['aDate']) ? -1 : 1;
});