|
array_multisort (PHP 4, PHP 5) array_multisort -- 對多個陣列或多維陣列進行排序 說明bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )
若果成功則返回 TRUE,失敗則返回 FALSE。
array_multisort()
可以用來一次對多個陣列進行排序,或是根據某一維或多維對多維陣列進行排序。
關聯(string)鍵名保持不變,但數字鍵名會被重新索引。
輸入陣列被當成一個表的列並以行來排序--這類似於 SQL 的 ORDER BY
子句的功能。第一個陣列是要排序的主要陣列。陣列中的行(值)比較為相同的話就按照下一個輸入陣列中相應值的大小來排序,依此類推。
本函數的參數結構有些不同尋常,但是非常靈活。第一個參數必須是一個陣列。接下來的每個參數可以是陣列或是是下面列出的排序標誌。
排序順序標誌:
SORT_ASC - 按照上升順序排序 SORT_DESC - 按照下降順序排序
排序類型標誌:
每個陣列之後不能指定兩個同類的排序標誌。每個陣列後特殊的排序標誌僅對該陣列有效 - 在此之前為預設值
SORT_ASC 和 SORT_REGULAR。
例子 1. 對多個陣列排序
<?php $ar1 = array("10", 100, 100, "a"); $ar2 = array(1, 3, "2", 1); array_multisort($ar1, $ar2);
var_dump($ar1); var_dump($ar2); ?>
|
本例中經由排序後,第一個陣列將包括
"10","a",100,100。第二個陣列將包括
1,1,"2",3。第二個陣列中的項目順序完全和第一個陣列中相應的項目(100 和 100)順序一致。
array(4) {
[0]=> string(2) "10"
[1]=> string(1) "a"
[2]=> int(100)
[3]=> int(100)
}
array(4) {
[0]=> int(1)
[1]=> int(1)
[2]=> string(1) "2"
[3]=> int(3)
} |
|
例子 2. 對多維陣列排序
<?php $ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1)); array_multisort ($ar[0], SORT_ASC, SORT_STRING, $ar[1], SORT_NUMERIC, SORT_DESC); ?>
|
|
本例中經由排序後,第一個陣列將包括
10,100,100,"a"(作為字串上升排序),第二個陣列將包括
1,3,"2",1(作為數值下降排序)。
例子 3. Sorting multi-dimensional array
<?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); ?>
|
本例中在排序後,第一個陣列將變成
"10",100,100,11,"a"(被當作字串以升冪排序)。第二個陣列將包括
1, 3, "2", 2, 1(被當作數字以降冪排序)。
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)
}
} |
|
例子 4. 對資料庫結果進行排序
本例中 data
陣列中的每個單元表示一個表中的一行。這是典型的資料庫記錄的資料集合。
例子中的資料如下:
volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7 |
資料全都存放在名為 data
的陣列中。這通常是通過迴圈從資料庫取得的結果,例如
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 升冪排序。
現在有了包括有行的陣列,但是 array_multisort()
需要一個包括列的陣列,因此用以下代碼來取得列,然後排序。
<?php // 取得列的清單 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); ?>
|
資料集合現在排好序了,結果如下:
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7 |
|
例子 5. 不區分大小寫字母排序
SORT_STRING 和
SORT_REGULAR
都是區分大小寫字母的,大寫字母會排在小寫字母之前。
要進行不區分大小寫的排序,就要按照原陣列的小寫字母複製來排序。
<?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); ?>
|
上例將輸出: Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
) |
|
【譯者注】本函數相當有用,為有助於理解,請再看下面這個例子:
例子 6. 名次排序
<?php $grade = array("score" => array(70, 95, 70.0, 60, "70"), "name" => array("Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Liu Qi")); array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC, // 將分數作為數值,由高到低排序 $grade["name"], SORT_STRING, SORT_ASC); // 將名字作為字串,由小到大排序 var_dump($grade); ?>
|
上例將輸出: array(2) {
["score"]=>
array(5) {
[0]=>
int(95)
[1]=>
string(2) "70"
[2]=>
float(70)
[3]=>
int(70)
[4]=>
int(60)
}
["name"]=>
array(5) {
[0]=>
string(5) "Li Si"
[1]=>
string(6) "Liu Qi"
[2]=>
string(7) "Wang Wu"
[3]=>
string(9) "Zhang San"
[4]=>
string(8) "Zhao Liu"
}
} |
本例中對包括成績的陣列 $grade
按照分數(score)由高到低進行排序,分數相同的人則按照名字(name)由小到大排序。排序後李四
95 分為第一名,趙六 60 分為第五名沒有異議。張三、王五和劉七都是
70 分,他們的名次則由其姓名的字母順序排序,Liu 在前,Wang 在後而
Zhang 在最後。為了區別,三個 70
分分別用了整數,浮點數和字串來表示,可以在程式輸出中清楚地看到它們排序的結果。
|
| |