PHP实现多维数组多字段自定义排序

 更新时间:2023年10月23日 11:00:35   作者:ZhiHuaWei  
这篇文章主要介绍了PHP实现多维数组多字段自定义排序,通过将待排序数组的各个数组的$field保存在一维数组fieldArr中,在传入array_multisort中参与排序,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组,需要的朋友可以参考下

一、多维数组根据某一字段排序

此处用到了PHP的array_multisort方法(对多个数组或多维数组进行排序),关于此方法的用法可以查看PHP开发手册。

首先我们假设一个数组:

    $demo_array = array(
        array('id' => 8, 'name' => 'Bob', 'age' => 18, 'score' => 92),
        array('id' => 9, 'name' => 'Sun', 'age' => 16, 'score' => 99),
        array('id' => 3, 'name' => 'Snow', 'age' => 16, 'score' => 82),
        array('id' => 11, 'name' => 'Frank', 'age' => 22, 'score' => 90)
    );

实现思路:

通过将待排序数组的各个数组的$field保存在一维数组fieldArr中,在传入array_multisort中参与排序。传入 array_multisort后,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组。

实现方法:

    /**
     * 数组按照某一字段排序
     * @param $array 需要排序的二维数组
     * @param $field 所根据排序的字段
     * @param bool $desc 排序类型
     */
    function array_sort_by_one_field(&$array, $field, $desc = false)
    {
        $fieldArr = array();
        foreach ($array as $k => $v) {
            $fieldArr[$k] = $v[$field];
        }
        $sort = $desc == false ? SORT_ASC : SORT_DESC;
        array_multisort($fieldArr, $sort, $array);
    }
    array_sort_by_one_field($demo_array, 'age', true);
    print_r($demo_array);

打印结果: 

Array
(
    [0] => Array
        (
            [id] => 11
            [name] => Frank
            [age] => 22
            [score] => 90
        )
    [1] => Array
        (
            [id] => 8
            [name] => Bob
            [age] => 18
            [score] => 92
        )
    [2] => Array
        (
            [id] => 3
            [name] => Snow
            [age] => 16
            [score] => 82
        )
    [3] => Array
        (
            [id] => 9
            [name] => Sun
            [age] => 16
            [score] => 99
        )
)

二、多维数组多个字段自定义排序

这个方法用到了PHP的func_get_args函数,关于此函数用法不会的也可以查看PHP开发手册。

同样的首先假设一个数组:

    $demo_array = array(
        array('id' => 8, 'name' => 'Bob', 'age' => 18, 'score' => 92),
        array('id' => 9, 'name' => 'Sun', 'age' => 16, 'score' => 99),
        array('id' => 3, 'name' => 'Snow', 'age' => 16, 'score' => 82),
        array('id' => 11, 'name' => 'Frank', 'age' => 22, 'score' => 90)
    );

实现思路:

实现思路和上面的差不多,只是多了采用PHP中的func_get_args函数,来动态获取传入的值,既可以解决多字段个数不确定的问题。

实现方法:

    /**
     * 多维数组多个字段自定义排序
     * 参数传递不确定
     */
    function array_sort_by_many_field()
    {
        //获取函数传递的参数,第一个参数必须是一个数组
        $args = func_get_args();
        if (empty($args)) {
            return null;
        }
        $arr = array_shift($args);
        if (!is_array($arr)) {
            throw new Exception("第一个参数必须要是一个数组");
        }
        foreach ($args as $key => $field) {
            if (is_string($field)) {
                $temp = array();
                foreach ($arr as $index => $val) {
                    $temp[$index] = $val[$field];
                }
                $args[$key] = $temp;
            }
        }
        $args[] = &$arr;//引用值
        call_user_func_array('array_multisort', $args);
        return array_pop($args);
    }
 
    $arr = array_sort_by_many_field($demo_array, 'score', SORT_DESC, 'age', SORT_ASC);
    print_r($arr);

打印结果: 

Array
(
    [0] => Array
        (
            [id] => 9
            [name] => Sun
            [age] => 16
            [score] => 99
        )
    [1] => Array
        (
            [id] => 8
            [name] => Bob
            [age] => 18
            [score] => 92
        )
    [2] => Array
        (
            [id] => 11
            [name] => Frank
            [age] => 22
            [score] => 90
        )
    [3] => Array
        (
            [id] => 3
            [name] => Snow
            [age] => 16
            [score] => 82
        )
)

 到此这篇关于PHP实现多维数组多字段自定义排序的文章就介绍到这了,更多相关PHP多维数组自定义排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论