PHP实现多维数组排序,按照多个key值排序。

  • 现有以下测试数据,每个用户有自己的年龄,姓名。
$data = [
    ['age' => 30, 'name' => 'Alexander'],
    ['age' => 30, 'name' => 'Brian'],
    ['age' => 19, 'name' => 'Barney'],
];

要求根据用户年龄的升序,姓名的倒序进行排序。故期望得到以下数据:

[
    ['age' => 19, 'name' => 'Barney'],
    ['age' => 30, 'name' => 'Brian'],
    ['age' => 30, 'name' => 'Alexander'],
];

方法在如下:需要注意的是key的长度和direction需要一致

/**
 * @param $array array 需要排序的多维数组
 * @param $key string | array 需要排序的健值 /可以是数组可以是健值
 * @param int $direction 排序方式
 * @param int $sortFlag
 */

function multisort(&$array, $key, $direction = SORT_ASC, $sortFlag = SORT_REGULAR)
{
    $keys = is_array($key) ? $key : [$key];
    if (empty($keys) || empty($array)) {
        return;
    }
    $n = count($keys);
    if (is_scalar($direction)) {
        $direction = array_fill(0, $n, $direction);
    } elseif (count($direction) !== $n) {
        echo "The length of $direction parameter must be the same as that of $keys.";
        die;
    }
    if (is_scalar($sortFlag)) {
        $sortFlag = array_fill(0, $n, $sortFlag);
    } elseif (count($sortFlag) !== $n) {
        echo "The length of $sortFlag parameter must be the same as that of $keys.";
        die;
    }
    $args = [];
    foreach ($keys as $i => $key) {
        $flag = $sortFlag[$i];
        $args[] = array_column($array, $key);
        $args[] = $direction[$i];
        $args[] = $flag;
    }
    $args[] = range(1, count($array));
    $args[] = SORT_ASC;
    $args[] = SORT_NUMERIC;

    $args[] = &$array;
    call_user_func_array('array_multisort', $args);
}

调用并打印数据结果

multisort($data, ['age'], [SORT_ASC, SORT_DESC]);
var_dump($data);

Array
(
    [0] => Array
        (
            [age] => 19
            [name] => Barney
        )

    [1] => Array
        (
            [age] => 30
            [name] => Brian
        )

    [2] => Array
        (
            [age] => 30
            [name] => Alexander
        )

)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,595评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,031评论 0 2
  • 一、MySQL优化 MySQL优化从哪些方面入手: (1)存储层(数据) 构建良好的数据结构。可以大大的提升我们S...
    宠辱不惊丶岁月静好阅读 7,286评论 1 8
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 5,005评论 0 1
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 11,178评论 1 13

友情链接更多精彩内容