php:多排序多维数组

时间:2014-08-24 14:34:03

标签: php arrays

我想 - 排序维数组。这是我的数组样本:

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);

1 个答案:

答案 0 :(得分: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']);
     }
 });