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
即是官方評論裏面的第一條;