array_multisort

(PHP 4, PHP 5, PHP 7, PHP 8)

array_multisort對多個數(shù)組或多維數(shù)組進行排序

說明

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed ...$rest
): bool

array_multisort() 可以用來一次對多個數(shù)組進行排序,或者根據(jù)某一維或多維對多維數(shù)組進行排序。

關(guān)聯(lián)(string)鍵名保持不變,但數(shù)字鍵名會被重新索引。

注意:

如果兩個成員完全相同,那么它們將保持原來的順序。 在 PHP 8.0.0 之前,它們在排序數(shù)組中的相對順序是未定義的。

參數(shù)

注意:

重置數(shù)組中的內(nèi)部指針,指向第一個元素。

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è)定選項:

排序類型標(biāo)志:

  • SORT_REGULAR - 將項目按照通常方法比較(不修改類型)
  • SORT_NUMERIC - 按照數(shù)字大小比較
  • SORT_STRING - 按照字符串比較
  • SORT_LOCALE_STRING - 根據(jù)當(dāng)前的本地化設(shè)置,按照字符串比較。 它會使用 locale 信息,可以通過 setlocale() 修改此信息。
  • SORT_NATURAL - 以字符串的"自然排序",類似 natsort()
  • SORT_FLAG_CASE - 可以組合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小寫不敏感的方式排序字符串。

參數(shù)可以和 array1_sort_order 交換或者省略,默認(rèn)情況下是 SORT_REGULAR

rest

可選的選項,可提供更多數(shù)組,跟隨在 sort order 和 sort flag 之后。 提供的數(shù)組和之前的數(shù)組要有相同數(shù)量的元素。 換言之,排序是按字典順序排列的。

返回值

成功時返回 true, 或者在失敗時返回 false。

范例

示例 #1 多個數(shù)組排序

<?php
$ar1 
= array(101001000);
$ar2 = array(1324);
array_multisort($ar1$ar2);

var_dump($ar1);
var_dump($ar2);
?>

這個例子里,排序后,第一個數(shù)組會包含 0、 10、 100、 100。 第二個數(shù)組會包含 4、1、 2、 3。 第二個數(shù)組里的項目對應(yīng)第一個數(shù)組后也進行了排序(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"11100100"a"),
       array(   
1,  2"2",   3,   1)
      );
array_multisort($ar[0], SORT_ASCSORT_STRING,
                
$ar[1], SORT_NUMERICSORT_DESC);
var_dump($ar);
?>

本例中在排序后,第一個數(shù)組將變成 "10",100,100,11,"a"(被當(dāng)作字符串以升序排列)。第二個數(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 對數(shù)據(jù)庫結(jié)果進行排序

本例中 data 數(shù)組中的每個單元表示一個表中的一行。這是典型的數(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() 需要一個包含列的數(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 作為最后一個參數(shù),以通用鍵排序
array_multisort($volumeSORT_DESC$editionSORT_ASC$data);
?>

數(shù)據(jù)集合現(xiàn)在排好序了,結(jié)果如下:

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

示例 #4 不區(qū)分大小寫字母排序

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

要進行不區(qū)分大小寫的排序,就要按照原數(shù)組的小寫字母拷貝來排序。

<?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
)

參見