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的设置转换类型后排序。

  • 相关阅读:
    【leetcode】106. Construct Binary Tree from Inorder and Postorder Traversal
    【leetcode】105. Construct Binary Tree from Preorder and Inorder Traversal
    【leetcode】236. Lowest Common Ancestor of a Binary Tree
    【leetcode】235. Lowest Common Ancestor of a Binary Search Tree
    【leetcode】352. Data Stream as Disjoint Intervals
    【leetcode】897. Increasing Order Search Tree
    【leetcode】900. RLE Iterator
    BEC listen and translation exercise 26
    BEC listen and translation exercise 25
    BEC listen and translation exercise 24
  • 原文地址:https://www.cnblogs.com/-mrl/p/14075150.html
Copyright © 2011-2022 走看看