(PHP 4, PHP 5, PHP 7, PHP 8)
array_multisort — 對(duì)多個(gè)數(shù)組或多維數(shù)組進(jìn)行排序
&$array1
,$array1_sort_order
= SORT_ASC,$array1_sort_flags
= SORT_REGULAR,...$rest
array_multisort() 可以用來一次對(duì)多個(gè)數(shù)組進(jìn)行排序,或者根據(jù)某一維或多維對(duì)多維數(shù)組進(jìn)行排序。
關(guān)聯(lián)(string)鍵名保持不變,但數(shù)字鍵名會(huì)被重新索引。
注意:
如果兩個(gè)成員完全相同,那么它們將保持原來的順序。 在 PHP 8.0.0 之前,它們?cè)谂判驍?shù)組中的相對(duì)順序是未定義的。
注意:
重置數(shù)組中的內(nèi)部指針,指向第一個(gè)元素。
array1
要排序的 array。
array1_sort_order
之前 array 參數(shù)要排列的順序。
SORT_ASC
按照上升順序排序, SORT_DESC
按照下降順序排序。
此參數(shù)可以和 array1_sort_flags
互換,也可以完全刪除,默認(rèn)是 SORT_ASC
。
array1_sort_flags
為 array 參數(shù)設(shè)定選項(xiàng):
排序類型標(biāo)志:
SORT_REGULAR
-
將項(xiàng)目按照通常方法比較(不修改類型)
SORT_NUMERIC
- 按照數(shù)字大小比較
SORT_STRING
- 按照字符串比較
SORT_LOCALE_STRING
- 根據(jù)當(dāng)前的本地化設(shè)置,按照字符串比較。
它會(huì)使用 locale 信息,可以通過 setlocale() 修改此信息。
SORT_NATURAL
- 以字符串的"自然排序",類似 natsort()
SORT_FLAG_CASE
- 可以組合
(按位或 OR)
SORT_STRING
或者
SORT_NATURAL
大小寫不敏感的方式排序字符串。
參數(shù)可以和 array1_sort_order
交換或者省略,默認(rèn)情況下是 SORT_REGULAR
。
rest
可選的選項(xiàng),可提供更多數(shù)組,跟隨在 sort order 和 sort flag 之后。 提供的數(shù)組和之前的數(shù)組要有相同數(shù)量的元素。 換言之,排序是按字典順序排列的。
成功時(shí)返回 true
, 或者在失敗時(shí)返回 false
。
示例 #1 多個(gè)數(shù)組排序
<?php
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);
var_dump($ar1);
var_dump($ar2);
?>
這個(gè)例子里,排序后,第一個(gè)數(shù)組會(huì)包含 0、 10、 100、 100。 第二個(gè)數(shù)組會(huì)包含 4、1、 2、 3。 第二個(gè)數(shù)組里的項(xiàng)目對(duì)應(yīng)第一個(gè)數(shù)組后也進(jìn)行了排序(100 和 100)。
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) }
示例 #2 排序多維數(shù)組
<?php
$ar = array(
array("10", 11, 100, 100, "a"),
array( 1, 2, "2", 3, 1)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?>
本例中在排序后,第一個(gè)數(shù)組將變成 "10",100,100,11,"a"(被當(dāng)作字符串以升序排列)。第二個(gè)數(shù)組將包含 1, 3, "2", 2, 1(被當(dāng)作數(shù)字以降序排列)。
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) } }
示例 #3 對(duì)數(shù)據(jù)庫結(jié)果進(jìn)行排序
本例中 data 數(shù)組中的每個(gè)單元表示一個(gè)表中的一行。這是典型的數(shù)據(jù)庫記錄的數(shù)據(jù)集合。
例子中的數(shù)據(jù)如下:
volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7
數(shù)據(jù)全都存放在名為 data 的數(shù)組中。這通常是通過循環(huán)從數(shù)據(jù)庫取得的結(jié)果,例如 mysql_fetch_assoc()。
<?php
$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);
?>
本例中將把 volume 降序排列,把 edition 升序排列。
現(xiàn)在有了包含有行的數(shù)組,但是 array_multisort() 需要一個(gè)包含列的數(shù)組,因此用以下代碼來取得列,然后排序。
<?php
// 取得列的列表
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// 你可以使用 array_column() 代替上面的代碼
$volume = array_column($data, 'volume');
$edition = array_column($data, 'edition');
// 將數(shù)據(jù)根據(jù) volume 降序排列,根據(jù) edition 升序排列
// 把 $data 作為最后一個(gè)參數(shù),以通用鍵排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
數(shù)據(jù)集合現(xiàn)在排好序了,結(jié)果如下:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7
示例 #4 不區(qū)分大小寫字母排序
SORT_STRING
和
SORT_REGULAR
都是區(qū)分大小寫字母的,大寫字母會(huì)排在小寫字母之前。
要進(jìn)行不區(qū)分大小寫的排序,就要按照原數(shù)組的小寫字母拷貝來排序。
<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);
print_r($array);
?>
以上例程會(huì)輸出:
Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )