zoukankan      html  css  js  c++  java
  • array_multisort函数,以及多维数组下排序的应用,并与usort函数对比

      以前比较少用这个函数,大部分自己接触的业务里,处理稍微大一些的数组的时候几乎都是从db里取出来的,在db里就order by了。

      最近倒是用了次,这个函数用来排序很强大,有点类似于sql中的order by,更像order by 后边有多个列名的时候(就是先以第一个列排序,然后再排第二列顺序这样)。这个函数尤其在多维数组排序的时候很有用。

    php参考手册:http://php.net/manual/zh/function.array-multisort.php

    手册里头这句话,对于理解这个函数的用法很重要:输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

    简单举个例子:

    $arr1 = array(5,4,3,1,1);

    $arr2 = array(1,2,3,4,5);

    array_multisort($arr1, $arr2);

    结果发现$arr1的顺序是1,1,3,4,5,$arr2的顺序是4,5,3,2,1。

    排序时类似这样:把这两个数组倒过来,arr1、arr2是一张表的表头,如下所示。

    arr1  arr2

    5    1

    4    2

    3    3

    1    4

    1    5

    它类似于sql中的  order by arr1, arr2 。。

    按照arr1排序时,发现有两个1,那么则按照arr2排序,因为默认是按照升序排,所以arr2中的4这一行排在第一行位置,arr2中的5这一行排在第二行。

    结果就是这样:

    arr1  arr2

    1    4

    1    5

    3    3

    4    2

    5    1

    相信能明白了吧哈哈~

    这个排序,会比较有用的地方在于多维数组的排序,来举个例子。

    比如given一个数组是这样的,结果要按照title升序排,如果title一样,按照age降序排。

    <?php
    
    // 按照title升序,age降序 排列
    $arr = array(
        array(
            'id' => 1,
            'nickname' => 'James',
            'title' => 'a',
            'age' => 30,
        ),
        array(
            'id' => 2,
            'nickname' => 'Wade',
            'title' => 'b',
            'age' => 31,
        ),
        array(
            'id' => 3,
            'nickname' => 'Bosh',
            'title' => 'c',
            'age' => 32,
        ),
        array(
            'id' => 4,
            'nickname' => 'Durant',
            'title' => 'a',
            'age' => 27,
        ),
        array(
            'id' => 5,
            'nickname' => 'Howard',
            'title' => 'b',
            'age' => 32,
        ),
    );
    
    

    使用array_multisort()函数:

    print_r($arr);
    
    // 把参加排序的字段, 拆出来成各个数组
    foreach($arr as $v){
        $arr_title[] = $v['title'];
        $arr_age[] = $v['age'];
    }
    
    // 排序,注意最后一个参数是希望得到的结果
    array_multisort($arr_title, SORT_ASC, $arr_age, SORT_DESC, $arr);// 函数中每个数组参数后面都可以加两个选项,是升/降序,按照数字/字符排序的选项
    
    
    print_r($arr);

    这里对比一下usort()函数的使用:

    print_r($arr);
    
    usort($arr, 'mysort');
    
    function mysort($v1, $v2){
        if($v1['title'] > $v2['title']){
            return 1;
        } else if ($v1['title'] < $v2['title']){
            return -1;
        } else { // 如果title相同,则比较age
            if($v1['age'] > $v2['age']){
                return -1;
            } else if ($v1['age'] < $v2['age']){
                return 1;
            }
            return 0;
        }
    }
    
    print_r($arr);

    显然可以看出array_multisort()在对比这种多维数组的情况下更简洁。

    接着上面的例子,又given一个case,比如说我希望按照age排序,但是我要指定一个顺序,而不是按照age数字的大小。

    比如age按照32->27->30->31的顺序来排。

    稍微有点经验的程序员就知道应该做一个映射,把这个指定的年龄顺序,映射一个有序的参照数组。

    代码如下:

    // 指定年龄顺序,映射一个有序的排序
    $map = array(
        32 => 'a',
        27 => 'b',
        30 => 'c',
        31 => 'd',
    );
    $arr_age = array();// 这个就是参照数组
    foreach($arr as $val){
        $arr_age[] = $map[$val['age']];
    }
    array_multisort($arr_age, $arr);// 搞定

     

    再举两个例子,这里就直接粘贴下手册里的两个例子,要好好理解,当然最后还是知道该什么时候用这个函数,怎么用它更高效了哈哈。

    ===============================

  • 相关阅读:
    ubuntu安装 scala
    提交jar作业到spark上运行
    在IDEA上用python来连接集群上的hive
    spark在eclipse上配置
    【Spring AOP】Spring AOP的使用方式【Q】
    【Spring 源码】ApplicationContext源码
    【Spring 源码】Spring 加载资源并装配对象的过程(XmlBeanDefinitionReader)
    【Spring Cloud】Spring Cloud使用总结
    【坑】不要使用各种框架提供的内部List
    Lombok的使用
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5049169.html
Copyright © 2011-2022 走看看