PHP开发小技巧②⑤—多维数组多字段自定义排序

时间:2022-04-21 19:00:01

        在前面的开发小技巧中已经介绍了一种二维数组根据key进行排序《PHP开发小技巧②—实现二维数组根据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
        )

)