zoukankan      html  css  js  c++  java
  • yii2 ArrayHelper的多维数组排序函数multisort

    你想让多维数组排序像SQL语句的order by 一样爽么,那就试试yii2的ArrayHelper::multisort,这货真的挺强大的。当然,PHP自己也有一个array_multisort(),不过今天,我们只说yii2。

    public static void multisort ( &$array, $key, $direction = SORT_ASC, $sortFlag = SORT_REGULAR )

    首先要知道这个函数应用场景是对二维数组按列排序,它不会返回一个新数组,这从第一个参数&$array我们就可以看出,传递的是这个数组的索引,执行函数后,原数组将会被改变。

    重点参数为$key,它接收3种形式

    第一种:字符串,该类型适合于采用一个列值排序

    /**
     * 我们对数组$arr按照id的大小进行降序排序
     */
    $arr = [
        0=>['id'=>1,'name'=>'abei'],
        1=>['id'=>2,'name'=>'li'],
        3=>['id'=>4,'name'=>'wb'],
        4=>['id'=>3,'name'=>'world']
    ];  
    
    ArrayHelper::multisort($arr,'id',SORT_DESC);
    var_dump($arr);
    
    //    获得结果为
    array (size=4)
      0 => 
        array (size=2)
          'id' => int 4
          'name' => string 'wb' (length=2)
      1 => 
        array (size=2)
          'id' => int 3
          'name' => string 'world' (length=5)
      2 => 
        array (size=2)
          'id' => int 2
          'name' => string 'li' (length=2)
      3 => 
        array (size=2)
          'id' => int 1
          'name' => string 'abei' (length=4)

    第二种:数组,该类型适合于对多个列值进行联合排序,当$key为数组时候,$direction如果为数组,且必须和$key数组长度一致,如果为字符串,则该字符串将作用于所有的$key.

    /**
     * 我们对数组$arr按照id的大小进行降序排序,然后对name进行生序排序
     */
    $arr = [
        0=>['id'=>1,'name'=>'abei'],
        1=>['id'=>1,'name'=>'li'],
        3=>['id'=>1,'name'=>'wb'],
        4=>['id'=>3,'name'=>'world']
    ];  
    
    ArrayHelper::multisort($arr,['id','name'],[SORT_DESC,SORT_ASC]);
    var_dump($arr);
    
    //    获得结果为
    array (size=4)
      0 => 
        array (size=2)
          'id' => int 3
          'name' => string 'world' (length=5)
      1 => 
        array (size=2)
          'id' => int 1
          'name' => string 'abei' (length=4)
      2 => 
        array (size=2)
          'id' => int 1
          'name' => string 'li' (length=2)
      3 => 
        array (size=2)
          'id' => int 1
          'name' => string 'wb' (length=2)

    第三种:自定义函数,当$key为一个函数时候,multisort将以这个函数的返回做作为排序的值,其他参数依旧。

    /**
     * 我们对数组$arr每一个子数组的id==1时,返回w,否则返回b,然后根据返回值进行降序排序
     */
    $arr = [
        0=>['id'=>1,'name'=>'abei'],
        1=>['id'=>1,'name'=>'li'],
        3=>['id'=>1,'name'=>'wb'],
        4=>['id'=>3,'name'=>'world']
    ];  
    
    
    ArrayHelper::multisort($arr,function($item){
        if($item['id'] == 1){
            return 'w';
        }else{
            return 'b';
        }
    },SORT_DESC);
    var_dump($arr);
    
    //    获得结果为
    array (size=4)
      0 => 
        array (size=2)
          'id' => int 1
          'name' => string 'abei' (length=4)
      1 => 
        array (size=2)
          'id' => int 1
          'name' => string 'li' (length=2)
      2 => 
        array (size=2)
          'id' => int 1
          'name' => string 'wb' (length=2)
      3 => 
        array (size=2)
          'id' => int 3
          'name' => string 'world' (length=5)

    第4个函数$sortFlag说明 $sortFlag共有6个值,详情可以参考 http://php.net/manual/en/function.sort.php, multisort将排序的值根据$sortFlag的设置转换类型后排序。

  • 相关阅读:
    小编见过的验证方式汇总
    Burp Suite Professional 针对APP抓包篡改数据提交【安全】
    关于Chrome 67 以后版本无法离线安装扩展的解决方法
    Postman 中上传图片的接口怎么做参数化呢?
    字符串-不同的编码格式下所占用的字节数【转】
    Java RandomAccessFile用法 【转】
    URI和URL的区别 【转】
    Java多线程-线程的同步与锁【转】
    浅谈Java多线程的同步问题 【转】
    Java中浮点数的精度问题 【转】
  • 原文地址:https://www.cnblogs.com/-mrl/p/14075150.html
Copyright © 2011-2022 走看看