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

本文固定链接: https://www.cxy163.net/archives/3225 | 绝缘体

该日志由 绝缘体.. 于 2020年10月21日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: PHP二维数组根据多个字段排序 | 绝缘体
关键字: , , , ,

PHP二维数组根据多个字段排序:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter