array_multisort
array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
array_multisort 排序的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。
# 使用语法
$a = [3, 4, 5, 6];
array_multisort($a, SORT_DESC, SORT_REGULAR);
# 可以将参数 array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR ]]看成一个单元,函数可以接收多个单元,并且单个单元中$array1_sort_order和$array1_sort_flags可以不填,可以互换;
var_dump($a);
// 输出:
// array(4) {
// [0]=>int(6)
// [1]=>int(5)
// [2]=>int(4)
// [3]=>int(3)
// }
$a = [3, 4, 5, 6];
# 根据官方例子
# 第一个例子
$ar1 = array(10, 100, 100, 0); // 注意$ar1和$ar2中值的对应关系
$ar2 = array(1, 3, 2, 4);
# 首先对$ar1根据SORT_ASC和SORT_REGULAR排序;
# 然后对$ar2根据$ar1排序的结果依照对应顺序进行排序;
# 如果$ar1中两个值相同,那么这两个值对应$ar2中的值再根据SORT_ASC和SORT_REGULAR排序;
array_multisort($ar1, $ar2);
var_dump($ar1, $ar2);
// 输出:
// array(4) {
// [0]=>int(0)
// [1]=>int(10)
// [2]=>int(100)
// [3]=>int(100)
// }
// array(4) {
// [0]=>int(4)
// [1]=>int(1)
// [2]=>int(2)
// [3]=>int(3)
// }
# 第二个例子
$ar = array(
array("10", 11, 100, 100, "a"),
array( 1, 2, "2", 3, 1)
);
# 对$ar[0]按照SORT_STRING字符串比较排序,SORT_ASC正序排列;
# 对$ar[1]按照$ar[0]排序的结果依照对应顺序进行排序;
# $ar[0]中相同值对应$ar[1]里面的值按照SORT_NUMERIC数字比较顺序,SORT_DESC逆序排列
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
// 输出:
// array(2) {
// [0]=> array(5) {
// [0]=>string(2) "10"
// [1]=>int(100)
// [2]=>int(100)
// [3]=>int(11)
// [4]=>string(1) "a"
// }
// [1]=>array(5) {
// [0]=>int(1)
// [1]=>int(3)
// [2]=>string(1) "2"
// [3]=>int(2)
// [4]=>int(1)
// }
// }
# 第二个例子中如果增加一个数组
$ar = array(
array(1, 2, 5, 5, 5, 5),
array(11, 12, 12, 12, 12, 16),
array(21, 22, 23, 24, 25, 26),
);
array_multisort($ar[0], SORT_DESC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_ASC, $ar[2], SORT_ASC);
var_dump($ar);
array_multisort($ar[0], SORT_DESC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_ASC, $ar[2], SORT_DESC);
var_dump($ar);
// 可以实验下以上两种输入有和不同;其实试验了这个基本就知道了array_multisort的作用方式;
// 和mysql的order by相同;
// 对三个数组进行排序的时候,第一个数组是第一个排序的字段,然后依次排序;
// 三个参数的array_multisort可以理解如下:
// $ar[0] $ar[1] $ar[2]
// 1 11 21
// 2 12 22
// 5 12 23
// 5 12 24
// 5 12 25
// 5 16 26
// array_multisort($ar[0], SORT_DESC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_ASC, $ar[2], SORT_ASC)
// 以上函数排序的作用效果就等同:
// order by $ar[0] desc, order by $ar[1] asc, order by $ar[2] desc
// 所以排序结果为下:
// $ar[0] $ar[1] $ar[2]
// 5 12 23
// 5 12 24
// 5 12 25
// 5 16 26
// 2 12 22
// 1 11 21
// array_multisort($ar[0], SORT_DESC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_ASC, $ar[2], SORT_DESC)
// 以上函数排序的作用效果就等同:
// order by $ar[0] desc, order by $ar[1] asc, order by $ar[2] desc
// 所以排序结果为下:
// $ar[0] $ar[1] $ar[2]
// 5 12 25
// 5 12 24
// 5 12 23
// 5 16 26
// 2 12 22
// 1 11 21
# 第三个例子
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
// 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
print_r($data);
// 输出:
// array(6) {
// [0]=>array(2) {
// ["volume"]=>int(98)
// ["edition"]=>int(2)
// }
// [1]=>array(2) {
// ["volume"]=>int(86)
// ["edition"]=>int(1)
// }
// [2]=>array(2) {
// ["volume"]=>int(86)
// ["edition"]=>int(6)
// }
// [3]=>array(2) {
// ["volume"]=>int(85)
// ["edition"]=>int(6)
// }
// [4]=>array(2) {
// ["volume"]=>int(67)
// ["edition"]=>int(2)
// }
// [5]=>array(2) {
// ["volume"]=>int(67)
// ["edition"]=>int(7)
// }
// }
# 第三个例子可能比较不容易理解,再多点例子来辅助
# 例子3-1
$a = [
['key1' => 1, 'key2' => 10],
['key1' => 3, 'key2' => 11],
['key1' => 3, 'key2' => 12],
['key1' => 5, 'key2' => 13],
['key1' => 6, 'key2' => 14],
];
$b = [6, 5, 4, 3, 2];
array_multisort($b, $a);
var_dump($b, $a);
// 输出:
// array(5) {
// [0]=>int(2)
// [1]=>int(3)
// [2]=>int(4)
// [3]=>int(5)
// [4]=>int(6)
// }
// array(5) {
// [0]=>array(2) {
// ["key1"]=>int(6)
// ["key2"]=>int(14)
// }
// [1]=>array(2) {
// ["key1"]=>int(5)
// ["key2"]=>int(13)
// }
// [2]=>array(2) {
// ["key1"]=>int(3)
// ["key2"]=>int(12)
// }
// [3]=>array(2) {
// ["key1"]=>int(3)
// ["key2"]=>int(11)
// }
// [4]=>array(2) {
// ["key1"]=>int(1)
// ["key2"]=>int(10)
// }
// }
# 例子3-2
$a = [
['key1' => 1, 'key2' => 10],
['key1' => 3, 'key2' => 11],
['key1' => 3, 'key2' => 12],
['key1' => 5, 'key2' => 13],
['key1' => 6, 'key2' => 14],
];
$b = [6, 5, 4, 3, 2];
$aKey1 = array_column($a, 'key1');
$aKey2 = array_column($a, 'key2');
array_multisort($b, $aKey1, $aKey2);
$aNew = array_map(function($v1, $v2){
return ['key1' => $v1, 'key2' => $v2];
}, $aKey1, $aKey2);
var_dump($b, $aKey1, $aKey2, $aNew);
// 输出:
// array(5) {
// [0]=>int(2)
// [1]=>int(3)
// [2]=>int(4)
// [3]=>int(5)
// [4]=>int(6)
// }
// array(5) {
// [0]=>int(6)
// [1]=>int(5)
// [2]=>int(3)
// [3]=>int(3)
// [4]=>int(1)
// }
// array(5) {
// [0]=>int(14)
// [1]=>int(13)
// [2]=>int(12)
// [3]=>int(11)
// [4]=>int(10)
// }
// array(5) {
// [0]=>array(2) {
// ["key1"]=>int(6)
// ["key2"]=>int(14)
// }
// [1]=>array(2) {
// ["key1"]=>int(5)
// ["key2"]=>int(13)
// }
// [2]=>array(2) {
// ["key1"]=>int(3)
// ["key2"]=>int(12)
// }
// [3]=>array(2) {
// ["key1"]=>int(3)
// ["key2"]=>int(11)
// }
// [4]=>array(2) {
// ["key1"]=>int(1)
// ["key2"]=>int(10)
// }
// }
# 例子3-1和3-2中,都是对$a根据$b的顺序去排序;
# 例子3-1中$a和3-2中$aNew结果一样;
# 二维数组,可以认为,二维数组被分两个一维数组,然后对这两个一维数组排序,最后再组合成一个二维数组;
# 那么现在我们可以得知官方第三个例子中,将二维数组取出他的两个一维数组,然后将二维数组按照它自己的两个一维数组的排序规则去排序;
封装过的二维数组排序方法:https://blog.csdn.net/alexander_phper/article/details/55215825
即是官方评论里面的第一条;