Function Reference >> Variable and Type Related Extensions >> Arrays >> Array Functions

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章