php函数 array_multisort详解 容易误解

一个PHP函数

首先是看手册http://PHP.net/manual/zh/function.array-multisort.PHP

然后在一些权威网站看更多的说明,比如http://www.w3school.com.cn/PHP/func_array_multisort.asp

对于array_multisort, 网站w3school上面给了详细的说明,如下(只要多读几遍就能理解)

定义和用法
array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。
注释:字符串键名将被保留,但是数字键名将被重新索引,从 0 开始,并以 1 递增。
注释:您可以在每个数组后设置排序顺序和排序类型参数。如果没有设置,每个数组参数会使用认值。

说明
array_multisort() 函数对多个数组或多维数组进行排序。
参数中的数组被当成一个表的列并以行来进行排序 - 这类似 sql 的 ORDER BY 子句的功能
一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。
一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改认的排列顺序)之一: 
SORT_ASC - 认,按升序排列。(A-Z) 
SORT_DESC - 按降序排列。(Z-A)
随后可以指定排序的类型: 
SORT_REGULAR - 认。将每一项按常规顺序排列。 
SORT_NUMERIC - 将每一项按数字顺序排列。
 SORT_STRING - 将每一项按字母顺序排列。


我写两个例子,来详细解释一下其工作原理

例1:多个数组

$a1 = ['1','2','3','4','4'];
$a2 = ['a','b', 'c', 'd', 'e'];
array_multisort($a1,SORT_DESC,$a2, SORT_DESC);
var_dump('<pre>',$a1, $a2);

得到的结果是
[4,4,3,2,1], [e,d,c,b,a]
解释

1、第一个参数一定是一个数组,也是主排序的数组,也就是说当有多个要排序的数组时(每个数组元素个数必须一样),大家的数据怎么变,都是跟着第一个数组的顺序。好比数据库sql(order by a, b),在怎么按照a字段和b字段排序,一条记录都是完整的。这里的一条记录,就是纵向看,$a1中的1在第几位,$a2中的a就在第几位,他们属于一条记录,看下图:

上图绿色的线划定的就属于一列。

2、首先第一个参数$a1是一个数组,第二参数SORT_DESC,说明要对其进行倒序排序。$a1变为了[4,4,3,2,1],那么$a2也是相对于$a1变化的,也即是说“整个5条记录是根据$a1的顺序排序的”, 最终得到的完整结果如下:


3、第三个参数$a2是一个数组,第四个参数SORT_DESC,说明当“整个5条记录”根据$a1数组排序完以后,如果有重复的值(比如4,4),那么“整个记录的重复的部分要根据$a2进行倒序排序”。变为如下结果:

例2:二维数组

$array = [
            ['beijing', 'shanghai', 'tianjin', 'shanghai'],
            ['1', '2', '3', '4'],
            ['a', 'b', 'c', 'd'],
        ];
array_multisort($array[0], SORT_DESC, $array[1], SORT_DESC);
var_dump('<pre>', $array);//['tianjin', 'shanghai', 'shanghai', 'beijing'], [3,4,2,1]

得到的结果

['tianjin', 'shanghai', 'shanghai', 'beijing'], [3,4,2,1]


这个跟多个数组的情况差不多,只是参数是传的二维数组的每一项。

实例1:

我在项目中的使用场景是,经常遇到一个二维数组,我要根据其中的一个字段进行排序,比如对于对于如下数组,记录了每个城市的业务员数量,我想对这个二维数组按照业务员数量倒序排序,

$array = [
            [
                'city'=> 'beijing',
                'person' => 99,
            ],
            [
                'city'=> 'shanghai',
                'person' => 30,
            ],
            [
                'city'=> 'tianjin',
                'person' => 10,
            ],
        ];
$sort = [];
foreach($array as $k => $v) {
      $sort[] = $v['person'];
}
array_multisort($sort, SORT_ASC, $array);
var_dump('<pre>', $array);

得到

array(3) {
  [0]=>
  array(2) {
    ["city"]=>
    string(7) "tianjin"
    ["person"]=>
    int(10)
  }
  [1]=>
  array(2) {
    ["city"]=>
    string(8) "shanghai"
    ["person"]=>
    int(30)
  }
  [2]=>
  array(2) {
    ["city"]=>
    string(7) "beijing"
    ["person"]=>
    int(99)
  }
}


我当年的错误理解,很奇葩,我开始用这个函数没怎么看官网说明,直接看到别人写的例子,就仿照,虽然用对了,但是我理解是错误的,比如上面的实例1,第一个参是从array中取到sort,是想让array里面的每一项,按照sort数组新产生的顺序排序。我当时就以为sort必须是array的一个子列,比如一模一样,实际sort跟array可以半毛钱关系没有,只是比如元素数一样。
————————————————
版权声明:本文为CSDN博主「songtaiwu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/songtaiwu/article/details/79421655

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...