php:多排序多维数组

问题描述 投票:-2回答:1

我想对多维数组进行多重排序。这是我的数组样本:

Array
(
    [0] => Array
        (
            [level] => beg01
            [start] => 09/10
            [finish] => 15/11
            [other] => blah blah
            [things] => blah blah
            [quite] => blah blah
            [a lot] => blah blah
            [actually] => blah blah
        )
    [1] => Array
        (
            [level] => beg01
            [start] => 01/10
            [finish] => 10/11
            [other] => blah blah
            [things] => blah blah
            [quite] => blah blah
            [a lot] => blah blah
            [actually] => blah blah
        )
........ 
}

我希望结果按键“级别”排序,在每个级别中,我希望项目按键“开始”排序。像这样:

level 1 : 01/01
level 1 : 01/02
level 1 : 02/03

level 2 : 01/02
level 2 : 02/02
level 2 : 03/02
....

到目前为止,这就是我所做的:我通过这个函数传递了两次数组:

function sort_one($arr,$index) {
                $b = array();
                $c = array();
                foreach ($arr as $key => $value) {
                    $b[$key] = $value[$index];
                }
                asort($b);

                foreach ($b as $key => $value) {
                    $c[] = $arr[$key];
                }

                return $c;
}

索引级别和开始。我得到两个新的数组$ by_level和$ by_date。

然后我多了他们:

array_multisort($by_level, $by_date);

它几乎可以工作但有些元素不到位,所以我觉得我做错了。

编辑:找到一个有效的解决方案

$sort = array();
foreach($query_result as $k=>$v) {
    $sort['level'][$k] = $v['level'];
    $sort['start'][$k] = $v['start'];
}
array_multisort($sort['level'], SORT_ASC, $sort['start'], SORT_ASC,$query_result);
php arrays
1个回答
0
投票

您可以通过使用带有回调的usort来一次性完成此操作,该回调首先比较级别,然后仅在级别相等时比较开始:

usort($query_result, function($lhs, $rhs) {
     if ( $lhs['level'] == $rhs['level'] ) {
           return strcmp($lhs['start'], $rhs['start']);
     } else {
           return strcmp($lhs['level'], $rhs['level']);
     }
 });
© www.soinside.com 2019 - 2024. All rights reserved.