php多维数组按多个列排序

比如下面的数组

$a=array(2,2,2,2,2,2,3,3);
$b=array(1,3,3,2,2,2,2,2);
$n=array(1,2,3,4,5,6,7,8);
foreach ($a as $k=>$i){
    $c[]=array('a'=>$i,'b'=>$b[$k],'n'=>$n[$k]);
}
array_multisort($a,SORT_DESC,$n);
var_dump($n);

输出

array(7,8,1,2,3,4,5,6)

是先按数组a的方式来排序,数组n再默认按升序排序

array_multisort($a,SORT_DESC,$b,SORT_DESC,$n);

加上数组b后,先按数组a排序,再按数组b排序,数组n再默认按升序排序,输出

array(7,8,2,3,4,5,6,1)
$arr = [
    1=>['a' => 1, 'b' => 20, 'c' => 1, 'd' => 0, 'name' => 'a1'],
    2=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 35, 'name' => 'a2'],
    3=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 31, 'name' => 'a3'],
    4=>['a' => null, 'b' => 2, 'c' => 1, 'd' => 30, 'name' => 'a4'],
    5=>['a' => 0, 'b' => 2, 'c' => 10, 'd' => 13, 'name' => 'a5'],
    6=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 3, 'name' => 'a6'],
];

function sortArrByManyField() {
    $args = func_get_args();                                                        // 获取函数的参数的数组
    if (empty($args)) {
        return null;
    }
    $arr = array_shift($args);        // array_shift() 函数删除数组中第一个元素,并返回被删除元素的值
    foreach($args as $key => $field) {                                         //field=a,key=0
        if (is_string($field)) {
            $temp = array();
            foreach($arr as $index => $val) {
                $temp[$index] = $val[$field];                                     // $index=0, $val['a'] =1
            }
            $args[$key] = $temp;                                                    // $args[0]= [1,1,1,NULL,0,1]
        }
    }
    $args[] = &$arr;                                                                    //引用值
    
    call_user_func_array('array_multisort', $args);
    
    //将第二个参数作为参数传给第一个参数,第一个参数是方法名
    //array_multisort,参数可以是数组+顺序+排序类型(字符串/数字), 或者数组+顺序+数组+顺序。后一个数组按前一个数组的顺序排序
    
    return array_pop($args);
    
     // array_pop()功能是数组的最后一个元素出栈,返回值是数组的最后一个元素
}
$arr = sortArrByManyField($arr, 'a', SORT_DESC, 'b', SORT_DESC, 'c', SORT_ASC, 'd', SORT_ASC);
//var_dump($arr);

call_user_func_array中传入的$args是

[
  0=>[1,1,1,NULL,0,1],
  1=>3,//这里应该是对应的SORT_DESC
  2=>[20,2,2,2,2,2],
  3=>3,
  4=>[1,20,20,1,10,20],
  5=>4,
  6=>[0,35,31,30,13,3],
  7=>4,
  8=>&[
    1=>['a' => 1, 'b' => 20, 'c' => 1, 'd' => 0, 'name' => 'a1'],
    2=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 35, 'name' => 'a2'],
    3=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 31, 'name' => 'a3'],
    4=>['a' => null, 'b' => 2, 'c' => 1, 'd' => 30, 'name' => 'a4'],
    5=>['a' => 0, 'b' => 2, 'c' => 10, 'd' => 13, 'name' => 'a5'],
    6=>['a' => 1, 'b' => 2, 'c' => 20, 'd' => 3, 'name' => 'a6'],
    ],
]

最后获取到的就是按a降序,b降序,c升序,d升序,排列好的多维数组
即顺序为a1,a6,a3,a2,a4,a5
附上打印出来的结果

array(6) {
  [0]=>
  array(5) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(20)
    ["c"]=>
    int(1)
    ["d"]=>
    int(0)
    ["name"]=>
    string(2) "a1"
  }
  [1]=>
  array(5) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(2)
    ["c"]=>
    int(20)
    ["d"]=>
    int(3)
    ["name"]=>
    string(2) "a6"
  }
  [2]=>
  array(5) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(2)
    ["c"]=>
    int(20)
    ["d"]=>
    int(31)
    ["name"]=>
    string(2) "a3"
  }
  [3]=>
  array(5) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(2)
    ["c"]=>
    int(20)
    ["d"]=>
    int(35)
    ["name"]=>
    string(2) "a2"
  }
  [4]=>
  array(5) {
    ["a"]=>
    NULL
    ["b"]=>
    int(2)
    ["c"]=>
    int(1)
    ["d"]=>
    int(30)
    ["name"]=>
    string(2) "a4"
  }
  [5]=>
  array(5) {
    ["a"]=>
    int(0)
    ["b"]=>
    int(2)
    ["c"]=>
    int(10)
    ["d"]=>
    int(13)
    ["name"]=>
    string(2) "a5"
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值