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_REGULAR - 將項目按照通常方法比較

  • SORT_NUMERIC - 將項目按照數值比較

  • SORT_STRING - 將項目按照字串比較

每個陣列之後不能指定兩個同類的排序標誌。每個陣列後特殊的排序標誌僅對該陣列有效 - 在此之前為預設值 SORT_ASCSORT_REGULAR

例子 1. 對多個陣列排序

<?php
$ar1 
= array("10"100100"a");
$ar2 = array(13"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"100100"a"), array (13"2"1));
array_multisort ($ar[0], SORT_ASCSORT_STRING,
                 
$ar[1], SORT_NUMERICSORT_DESC);
?>

本例中經由排序後,第一個陣列將包括 10,100,100,"a"(作為字串上升排序),第二個陣列將包括 1,3,"2",1(作為數值下降排序)。

例子 3. Sorting multi-dimensional array

<?php
$ar 
= array(
       array(
"10"11100100"a"),
       array(   
1,  2"2",   3,   1)
      );
array_multisort($ar[0], SORT_ASCSORT_STRING,
                
$ar[1], SORT_NUMERICSORT_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($volumeSORT_DESC$editionSORT_ASC$data);
?>

資料集合現在排好序了,結果如下:

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

例子 5. 不區分大小寫字母排序

SORT_STRINGSORT_REGULAR 都是區分大小寫字母的,大寫字母會排在小寫字母之前。

要進行不區分大小寫的排序,就要按照原陣列的小寫字母複製來排序。

<?php
$array 
= array('Alpha''atomic''Beta''bank');
$array_lowercase array_map('strtolower'$array);

array_multisort($array_lowercaseSORT_ASCSORT_STRING$array);

print_r($array);
?>

上例將輸出:

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)

【譯者注】本函數相當有用,為有助於理解,請再看下面這個例子:

例子 6. 名次排序

<?php
$grade 
= array("score" => array(709570.060"70"),
               
"name" => array("Zhang San""Li Si""Wang Wu",
                               
"Zhao Liu""Liu Qi"));
array_multisort($grade["score"], SORT_NUMERICSORT_DESC,
                
// 將分數作為數值,由高到低排序
                
$grade["name"], SORT_STRINGSORT_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 分分別用了整數,浮點數和字串來表示,可以在程式輸出中清楚地看到它們排序的結果。