1. 程式人生 > >PHP array_multisort對多維陣列或多個數組排序

PHP array_multisort對多維陣列或多個數組排序

PHP對一維陣列排序,可能大家都很清楚,主要有以下幾個:
sort() 對陣列排序
rsort() 對陣列逆向排序
asort()  保持索引關係
arsort() 逆向排序,並保持索引關係
ksort() 按鍵名排序
krsort() 按鍵名逆向排序
usort() 使用使用者自定義的函式對陣列進行排序
uksort() 使用使用者自定義的函式對陣列鍵名進行排序
natsort() 用自然排序演算法對陣列排序
natcasesort() 用自然排序演算法對陣列排序,不區分大小寫
如果是多維陣列或者對多個數組排序的話,PHP也提供了一個函式:array_multisort()
bool array_multisort ( array $ar1 [, mixed $arg [, mixed $... [, array $... ]]] ),

成功返回true,失敗返回false
使用說明:

關聯(string)鍵名保持不變,但數字鍵名會被重新索引。 
輸入陣列被當成一個表的列並以行來排序——這類似於 SQL 的 ORDER BY 子句的功能。第一個陣列是要排序的主要陣列。陣列中的行(值)比較為相同的話就按照下一個輸入陣列中相應值的大小來排序,依此類推。——這句話是理解此函式用法的關鍵。

第一個引數必須是一個數組。接下來的每個引數可以是陣列或者是下面列出的排序標誌。

排序順序標誌: 
■SORT_ASC - 按照上升順序排序 
■SORT_DESC - 按照下降順序排序

排序型別標誌: 
■SORT_REGULAR - 將專案按照通常方法比較 
■SORT_NUMERIC - 將專案按照數值比較 
■SORT_STRING - 將專案按照字串比較

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


案例一:對多個數組進行排序
  1. /**
  2. * 多個數組排序
  3. * @blog<http://www.phpddt.com>
  4. */
  5. $arr1 = array(1,9,5);
  6. $arr2 = array(6,2,4);
  7. $arr3 = array(3,7,8);
  8. array_multisort($arr1,$arr2,$arr3);
  9. print_r($arr1);
  10. print_r($arr2);
  11. print_r($arr3);

看以看到結果是:
  1. Array
  2. (
  3. [0]=>
    1
  4. [1]=>5
  5. [2]=>9
  6. )
  7. Array
  8. (
  9. [0]=>6
  10. [1]=>4
  11. [2]=>2
  12. )
  13. Array
  14. (
  15. [0]=>3
  16. [1]=>8
  17. [2]=>7
  18. )

很明顯,array_multisort會先按第一個陣列(想像成列)排序,如果第一個陣列(列)的值相同,則按第二個陣列(列)排序,一次類推。(個人見解:第一個陣列排序之後,根據第一個陣列的鍵(原先的鍵)順序排序之後的陣列(之後的陣列沒定義排序的情況下))
案例二:對多維陣列排序(二維陣列為例)
  1. /**
  2. * 多維陣列排序
  3. * @blog<http://www.phpddt.com>
  4. */
  5. $arr = array(
  6. array('id'=>1,'data'=>'a'),
  7. array('id'=>3,'data'=>'c'),
  8. array('id'=>2,'data'=>'b'),
  9. array('id'=>2,'data'=>'a')
  10. );
  11. $id = $data = array();
  12. foreach($arr as $key => $value){
  13. $id[$key]= $value['id'];
  14. $data[$key]= $value['data'];
  15. }
  16. array_multisort($id, SORT_ASC, $data, SORT_DESC, $arr);
  17. print_r($arr);

結果很顯然:
  1. Array
  2. (
  3. [0]=>Array
  4. (
  5. [id]=>1
  6. [data]=> a
  7. )
  8. [1]=>Array
  9. (
  10. [id]=>2
  11. [data]=> b
  12. )
  13. [2]=>Array
  14. (
  15. [id]=>2
  16. [data]=> a
  17. )
  18. [3]=>Array
  19. (
  20. [id]=>3
  21. [data]=> c
  22. )
  23. )

你可以對array_multisort()稍稍封裝下更好用,如我:
 
  1. function sort_array($array, $keyid, $order='asc', $type='number'){
  2. if(is_array($array)){
  3. foreach($array as $val){
  4. $order_arr[]= $val[$keyid];
  5. }
  6. $order =($order =='asc')? SORT_ASC: SORT_DESC;
  7. $type =($type =='number')? SORT_NUMERIC: SORT_STRING;
  8. array_multisort($order_arr, $order, $type, $array);
  9. }
  10. }