標籤:lag ini 演算法 blank 區分大小寫 frog 位元運算 而不是 字母
數組排序函數包括:
sort()、rsort()、asort()、arsort()、ksort()、krsort()、natsort()、natcasesort()、shuffle()、array_multisort()、usort()、uasort()、uksort()
在區分這些數組排序函數之前,要明確一下幾個排序相關的知識點:
- 有些函數基於 array 的鍵來排序, 而其他的基於值來排序的:$array[‘key‘] = ‘value‘;。
- 數組經過上述函數進行排序,數組在排序前鍵與值得關聯關係在一些排序函數處理後依然能夠保持,而在另一些函數處理後不能保持。
- 可供選擇的定序有:
1. SORT_REGULAR - 正常比較單元(不改變類型) 即字串按照字串規則排序,數字按照數字排序,然後再將兩個類型拼接在一起(字串在前,數字在後)
2. SORT_NUMERIC - 單元被作為數字來比較
3. SORT_STRING - 單元被作為字串來比較
4. SORT_LOCALE_STRING - 根據當前的地區(locale)設定來把單元當作字串比較,可以用 setlocale() 來改變。
5. SORT_NATURAL - 和 natsort() 類似對每個單元以“自然的順序”對字串進行排序。 PHP 5.4.0 中新增的。 自然排序:(實現了一個和人們通常對字母數字字串進行排序的方法一樣的排序演算法並保持原有鍵/值的關聯,這被稱為“自然排序”),具體的實現規則可以參考:natsort
6. SORT_FLAG_CASE - 能夠與 SORT_STRING 或 SORT_NATURAL 合并(OR 位元運算),不區分大小寫排序字串。
- 所有排序函數都是直接作用於數組本身, 而不是返回一個新的有序的數組
- 所有排序函數底層採用的演算法為快速排序,因此是不穩定排序。
| 函數申明 |
排序依據 |
數組索引鍵保持 |
排序的順序 |
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
value |
否 |
由低到高 |
bool rsort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
value |
否 |
由高到低 |
bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
value |
是 |
由低到高 |
bool arsort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
value |
是 |
由高到低 |
bool natsort ( array &$array ) |
value |
是 |
自然排序,大小寫敏感 |
bool natcasesort ( array &$array ) |
value |
是 |
自然排序,大小寫不敏感 |
bool ksort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
key |
是 |
key由低到高 |
bool krsort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) |
key |
是 |
key由高到低 |
bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] ) |
value |
關聯(string)鍵名保持不變,但數字鍵名會被重新索引 |
由參數決定 |
bool shuffle ( array &$array ) |
value |
否 |
打亂數組 |
bool usort ( array &$array , callable $value_compare_func ) |
value |
否 |
使用者定義 |
bool uasort ( array &$array , callable $value_compare_func ) |
value |
是 |
使用者定義 |
bool uksort ( array &$array , callable $key_compare_func ) |
key |
是 |
使用者定義 |
需要補充的重點:
- sort()、rsort()、shuffle()、usort()會打破排序前key與value之間的關聯
- array_multisort(), 除了可以對多個數組進行關聯排序,或者對多維陣列進行排序。因此要求參與排序的數組size保持一致,或者多維陣列每一維元素個數相等。
1 <?php 2 $ar1 = array(10, 100, 100, 0); 3 $ar2 = array(1, 3, 2, 4); 4 array_multisort($ar1, $ar2); 5 var_dump($ar1); 6 var_dump($ar2); 7 /*********** 8 關聯排序,以$ar1 regular 升序排序,$ar2 在與$ar1關聯的基礎上,對相同$ar1值,不同$ar2值進行排序 9 array(4) {10 [0]=> int(0)11 [1]=> int(10)12 [2]=> int(100)13 [3]=> int(100)14 }15 array(4) {16 [0]=> int(4)17 [1]=> int(1)18 [2]=> int(2)19 [3]=> int(3)20 }21 **********/22 23 $ar = array(24 array("10", 11, 100, 100, "a"),25 array( 1, 2, "2", 3, 1)26 );27 array_multisort($ar[0], SORT_ASC, SORT_STRING,28 $ar[1], SORT_NUMERIC, SORT_DESC);29 var_dump($ar);30 /*********31 array(2) {32 [0]=> array(5) {33 [0]=> string(2) "10"34 [1]=> int(100)35 [2]=> int(100)36 [3]=> int(11)37 [4]=> string(1) "a"38 }39 [1]=> array(5) {40 [0]=> int(1)41 [1]=> int(3)42 [2]=> string(1) "2"43 [3]=> int(2)44 [4]=> int(1)45 }46 }47 *********/
PHP 數組排序相關函數總結