二維數組重新排序
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。
案例一:對多個數組進行排序
/**
* 多個數組排序
* @blog<http://www.phpddt.com>
*/
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);
print_r($arr1);
print_r($arr2);
print_r($arr3);
看以看到結果是:
- Array
- (
- [0] => 1
- [1] => 5
- [2] => 9
- )
- Array
- (
- [0] => 6
- [1] => 4
- [2] => 2
- )
- Array
- (
- [0] => 3
- [1] => 8
- [2] => 7
- )
很明顯,array_multisort會先按第一個數組(想像成列)排序,如果第一個數組(列)的值相同,則按第二個數組(列)排序,一次類推。(個人見解:第一個數組排序之後,根據第一個數組的鍵(原先的鍵)順序排序之後的數組(之後的數組沒定義排序的情況下))
案例二:對多維數組排序(二維數組為例)
/**
* 多維數組排序
* @blog<http://www.phpddt.com>
*/
$arr = array(
array(‘id‘=>1,‘data‘=>‘a‘),
array(‘id‘=>3,‘data‘=>‘c‘),
array(‘id‘=>2,‘data‘=>‘b‘),
array(‘id‘=>2,‘data‘=>‘a‘)
);
$id = $data = array();
foreach($arr as $key => $value){
$id[$key] = $value[‘id‘];
$data[$key] = $value[‘data‘];
}
array_multisort($id, SORT_ASC, $data, SORT_DESC, $arr);
print_r($arr);
結果很顯然:
- Array
- (
- [0] => Array
- (
- [id] => 1
- [data] => a
- )
- [1] => Array
- (
- [id] => 2
- [data] => b
- )
- [2] => Array
- (
- [id] => 2
- [data] => a
- )
- [3] => Array
- (
- [id] => 3
- [data] => c
- )
- )
你可以對array_multisort()稍稍封裝下更好用,如我:
- function sort_array($array, $keyid, $order=‘asc‘, $type=‘number‘) {
- if(is_array($array)) {
- foreach($array as $val) {
- $order_arr[] = $val[$keyid];
- }
- $order = ($order == ‘asc‘) ? SORT_ASC: SORT_DESC;
- $type = ($type == ‘number‘) ? SORT_NUMERIC: SORT_STRING;
- array_multisort($order_arr, $order, $type, $array);
- }
- }
二維數組重新排序