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
即是官方评论里面的第一条;

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