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
对字符
处理时是否忽略大小写,这个很容易理解。