PHP 的排序函数提供了如下几种排序模式:
-
SORT_REGULAR
- compare items normally (don't change types) -
SORT_NUMERIC
- compare items numerically -
SORT_STRING
- compare items as strings -
SORT_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-insensitively
SORT_REGULAR
SORT_REGULAR
,默认排序模式,会依照数组成员的原数据类型
进行排序:
- 字符串类型使用 ASCII 码字符串排序,即按位依次比较 ASCII 码大小,如相同则比较下一位,比如
"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排序
)和数值类型(数值排序
)的元素被分开使用各自的默认规则排序,也可以说默认排序以:字符串
<数值
作为升序。
SORT_STRING & SORT_LOCALE_STRING
SORT_STRING
会尝试将元素都当做字符串
数据进行排序处理,而且这种模式是安全
的,因为数值
类型转字符串
类型不会有什么非法或截断的问题,然后按照 ASCII排序
进行处理。
<?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
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
SORT_NATURAL
看字面意思理解就是自然排序
,特点在于对字符串+数值
类型的数据也能以对人类友好的方式排序出来。
比如待排序数列:"a2"
"a12"
"c1"
"c12"
对我们来说,最为容易理解的是先按照字母
排序,字母
相同的时就按后面的数值整体
做排序,即: a2 < a12 < c1 < c12
这个样子
先看一下默认的和其他几种排序模式会得到什么结果:
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
处理机制大概如下:
1、元素可以
转为数值
, 则做数值自然排序
2、元素无法
转为数值
, 则对元素非数值部分
做字符串排序
,如果有数值部分
则对数值部分
做数值排序
3、以数值
<字符串
的升序对数据做分区排列。
<?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_FLAG_CASE
主要配合 SORT_STRING
和 SORT_NATURAL
对字符
处理时是否忽略大小写,这个很容易理解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。