宽屏模式

二维数组,多字段排序

/**

 * 对二维数组依次按照排序规则数组指定的字段和顺序进行排序,在有相同的情况下按下一个字段和顺序进行排序

 * @param array $arr 待排序的数组

 * @param array $fieldSortMap:排序规则数组, 一维关联数组,每个元素的键为排序字段名称,值为排序方向:SORT_ASC升序或SORT_DESC降序

 * @return array

 */

function multiSortByFields(array $arr, array $fieldSortMap) {

    $count = count($arr);

    if ($count <= 1 || empty($fieldSortMap)) {

        return $arr;

    }

    $params = [];

//将排序字段所拥有的值分别放入数组中,以备排序

    foreach ($fieldSortMap as $field => $sort) {

//field值数组,必须每个元素中都要有

        $fieldValues = array_column($arr, $field);

        if (count($fieldValues) != $count) {

            return $arr;

        }

//准备参数:依次分别是排序field的值数组和对应的排序方向(升序,降序)

        $params[] = $fieldValues;

        $params[] = $sort == SORT_ASC ? SORT_ASC : SORT_DESC;

// $params[] = SORT_NUMERIC;

    }

//将原数组放入

    $params[] = &$arr;

//排序

    array_multisort(...$params);

    return $arr;

}

$a = [

    [

        'a' => 1,

        'b' => 111

    ],

    [

        'a' => 0,

        'b' => 111

    ],

    [

        'a' => 3,

        'b' => 333

    ],

    [

        'a' => 4,

        'b' => 333

    ],

];

//先按b字段的值倒序排序,如b字段的值相同,则按a字段的值升序排序

$fieldSortMap = [

    'b' => SORT_DESC,

    'a' => SORT_ASC

];

$res = multiSortByFields($a, $fieldSortMap);

var_dump($res);

Larwas
请先登录后发表评论
  • latest comments
  • 总共0条评论