关于PHP数组多个数组或多维数组排序的方法
在项目中遇到一个使用array_multisort函数排序的操作,因为以前没有接触过,从参数上看不出什么名堂,甚至有点懵懵哒。
因为这块业务逻辑是关于订单统计,从各个维度对订单统计,因此比较重要。要想优化这块代码,这个函数是的使用方法是绕不过去的。
array_multisort(array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $…]]]): bool
和其他的排序函数一样,该函数参数也是以传址方式,这意味着直接改变所传递的参数值。当数组是关联数组时,键值对保持不变,但数字键名会被重新索引。
该函数可以传递任意多个数组进行排序,且每个数组元素的数量要相同。
每个需要排序的数组参数后都可以紧跟两个参数,后面第一个是排序方式(升序或降序),第二个是为排序选定类型,当然这两个参数是非必填的。
排序的方式也很简单,所有要排序的数组,都依照第一个数组的排序方式排序。也就是不管后面的数组定义怎样的排序方式,都会先按照第一个数组的排序方式排列。
当第一个数组排序过程中有两个相同的值,谁在前,谁在后呢?答案就是第二个数组的排序方式决定,比如当第一个数组中第三个元素和第四个元素相同时,再去看一下第二个数组中(此时已经按照第一个数组的排序方式排过序)同样的第三个元素与第四个元素谁在前,谁在后。
后面所有的要排序数组都是以这种依此类推的方式排列的:
// 复制粘贴跑起来
$a = [
'a' => 10,
'b' => 60,
'c' => 70,
'd' => 13,
'e' => 60
];
$b = [
'a' => 2,
'b' => 19,
'c' => 16,
'd' => 49,
'e' => 2
];
// 不指定排序规则默认都是ASC
// 对比两次排序的结果,即可明白
array_multisort($a,$b);
echo '<pre>';
var_dump($a);
var_dump($b);
// 注意观察键名
array_multisort($a,$b, SORT_DESC);
echo '观察键名<br>';
var_dump($a);
var_dump($b);
所有数组按照第一个数组指定的排序方式排列,第一个数组中有相同元素时,将按照后面数组中相同位置的元素排序结果进行排序。后面所有数组经过第一次排序后若同样有相同元素且位置紧挨着,则再次按照后面数组中相同位置的元素的排序结果决定排序位置。