学一个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('',$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('', $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('', $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可以半毛钱关系没有,只是比如元素数一样。