«

PHP二维数组根据多个字段排序

时间:2024-2-18 09:30     作者:韩俊     分类: PHP


需求:二维数组,先根据字段A排序 如果A一样通过字段B排序。(更多字段排序原理一样)

该功能更好的处理方式请参考:php二维数组按其中某一列排序

使用php原生的array_multisort()函数,执行速度会快些且降低自定义函数的依赖,关于array_multisort详细使用 参考:

http://php.net/manual/zh/function.array-multisort.php

思路:

1. 先搜集要排序的字段的值分别组合成一个新的数组

2. 再用 array_multisort 根据要排序的字段值,按先后进行排序就行

示例:

//user_list数组根据多个字段排序,先按照性别将序排列,如果性别相同再按照年龄升序排列
foreach ($user_list as $key => $user) {
    $age[$key] = $user['age'];
    $gender[$key] = $user['gender'];
}
// 将数据先根据 gender 降序排列,再根据 age 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $gender, SORT_ASC, $age);

注意:使用该函数排序完之后,关联(string)键名保持不变,但数字键名会被重新索引。

下面有两个总结的方法,可以参考:

方法一:

function sortByCols($list, $field) {
    $sort_arr = array();
    $sort_rule = '';
    foreach ($field as $sort_field => $sort_way) {
        foreach ($list as $key => $val) {
            $sort_arr[$sort_field][$key] = $val[$sort_field];
        }
        $sort_rule .= '$sort_arr["' . $sort_field . '"],' . $sort_way . ',';
    }
    if (empty($sort_arr) || empty($sort_rule)) {
        return $list;
    }
    eval('array_multisort(' . $sort_rule . ' $list);');
    return $list;
}

使用示例:

$user_list = sortByCols($user_list, [
    'gender' => SORT_DESC, 
    'age' => SORT_ASC
]);

方法二:

function sortArrByManyField() {
    $args = func_get_args();
    if (empty($args)) {
        return null;
    }
    $arr = array_shift($args);
    foreach ($args as $key => $value) {
        if (is_string($value)) {
            $temp = array();
            foreach ($arr as $k => $v) {
                $temp[$k] = $v[$value];
            }
            $args[$key] = $temp;
        }
    }
    //引用值
    $args[] = &$arr;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}

使用示例:

sortArrByManyField($user_list, 'gender', SORT_DESC, 'age', SORT_ASC);

标签: php php教程

热门推荐