PHP 的排序函數提供了以下幾種排序模式:php
SORT_REGULAR
- compare items normally (don't change types)SORT_NUMERIC
- compare items numericallySORT_STRING
- compare items as stringsSORT_LOCALE_STRING
- compare items as strings, based on the current locale. It uses the locale, which can be changed using setlocale()SORT_NATURAL
- compare items as strings using "natural ordering" like natsort()SORT_FLAG_CASE
- can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitivelySORT_REGULAR
,默認排序模式,會依照數組成員的原數據類型
進行排序:數組
"2" > "12"
2 < 12
雖然 PHP 的數組高度靈活,能夠存儲不一樣類型值,但若是參與排序,建議格式統一類型。不然數據會被劃分紅兩塊:字符串類型區
/數值類型區
。安全
而後分別按各自的默認規則進行排序:函數
<?php $arr = [12, 2, 31, 302, "c", "a2", "a12", 1]; sort($arr); print_r($arr); // 字符串按ASCII排序 a12 < a2 < c / 數值按天然排序 Array ( [0] => a12 [1] => a2 [2] => c ----------- [3] => 1 [4] => 2 [5] => 12 [6] => 31 [7] => 302 )
能夠看到,字符串類型(ASCII排序
)和數值類型(數值排序
)的元素被分開使用各自的默認規則排序,也能夠說默認排序以:字符串
<數值
做爲升序。code
SORT_STRING
會嘗試將元素都當作字符串
數據進行排序處理,並且這種模式是安全
的,由於數值
類型轉字符串
類型不會有什麼非法或截斷的問題,而後按照 ASCII排序
進行處理。orm
<?php $arr = [12, 2, 31, 302, "c", "a2", "a12", 1]; sort($arr, SORT_STRING); print_r($arr); //能夠看到元素以ASCII位序進行排列 好比 "12" < "2" "302" < "31" Array ( [0] => 1 [1] => 12 [2] => 2 [3] => 302 [4] => 31 [5] => a12 [6] => a2 [7] => c )
SORT_NUMERIC
會將元素當作數值
類型處理,在使用時須要注意元素的類型,好比示例中的 "a2"
, "a12"
, "c"
元素並不能安全的由字符串
類型轉爲數值
類型,因此排序會將他們放置在最前並不參與排序(原樣奉還),"1"
能夠轉爲 1
,則能夠參與排序。排序
<?php $arr = [12, 2, 31, 302, "c", "a2", "1", "a12"]; sort($arr, SORT_NUMERIC); print_r($arr); //沒法轉爲數值類型的元素不會參與排序 會保持原前後順序返回 Array ( [0] => c [1] => a2 [2] => a12 ---------- [3] => 1 [4] => 2 [5] => 12 [6] => 31 [7] => 302 )
SORT_NATURAL
看字面意思理解就是天然排序
,特色在於對字符串+數值
類型的數據也能以對人類友好的方式排序出來。索引
好比待排序數列:"a2"
"a12"
"c1"
"c12"
字符串
對咱們來講,最爲容易理解的是先按照字母
排序,字母
相同的時就按後面的數值總體
作排序,即: a2 < a12 < c1 < c12
這個樣子string
先看一下默認的和其餘幾種排序模式會獲得什麼結果:
SORT_REGULAR
:會以 ASCII 字符串排序的方式處理數據 a12 < a2 < c12 < c2
不太天然SORT_STRING
:同SORT_REGULAR
,a12 < a2 < c12 < c2
不太天然SORT_NUMERIC
:數據沒法轉爲數值,沒法作排序處理
若是使用 SORT_NATURAL
模式呢?SORT_NATURAL
即可以按照咱們最容易理解的方式對數據進行排序:
SORT_NATURAL
模式:a2 < a12 < c2 < c12
,能夠看到SORT_NUMERIC
結合了SORT_STRING
+SORT_NUMERIC
處理機制大概以下:
一、元素能夠
轉爲數值
, 則作數值天然排序
二、元素沒法
轉爲數值
, 則對元素非數值部分
作字符串排序
,若是有數值部分
則對數值部分
作數值排序
三、以數值
<字符串
的升序對數據作分區排列。
<?php $arr = [12, 2, 31, 302, "c12", "a2", "1", "a12", "c1"]; sort($arr, SORT_NATURAL); print_r($arr); // "1" 被轉爲了 1 進行排序 // "c12", "a2", "a12", "c1" 以對咱們理解友好的方式排序 Array ( [0] => 1 [1] => 2 [2] => 12 [3] => 31 [4] => 302 ------------ [5] => a2 [6] => a12 [7] => c1 [8] => c12 )
天然排序還有個有個函數natsort
能夠作保留索引的天然排序,相似 asort($arr, SORT_NATURAL)
SORT_FLAG_CASE
主要配合 SORT_STRING
和 SORT_NATURAL
對字符
處理時是否忽略大小寫,這個很容易理解。