关于PHP数组多个数组或多维数组排序的方法

作者: 乘风御上者 分类: PHP 发布时间: 2020-11-19 08:45

在项目中遇到一个使用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);

所有数组按照第一个数组指定的排序方式排列,第一个数组中有相同元素时,将按照后面数组中相同位置的元素排序结果进行排序。后面所有数组经过第一次排序后若同样有相同元素且位置紧挨着,则再次按照后面数组中相同位置的元素的排序结果决定排序位置。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复