5.9 数组排序
当然,数据排序是计算机科学的核心问题。任何上过入门级编程课的人都知道一些排序算法,如冒泡排序、堆排序、希尔排序和快速排序。这个问题在日常编程任务中出现得非常频繁,对数据排序就如同创建if条件或while循环一样成为常事。PHP提供了能以多种不同方式对数组排序的大量有用的函数,从而简化了这个过程。本节将介绍这些函数。
提示 默认情况下,PHP的排序函数按英语指定的规则进行排序。如果需要按另一种语言的约定进行排序,比如法语或德语,就需要修改此默认行为,可以使用setlocale()函数设置你的本地化环境(locale)。
1. sort()
![]()
sort()函数会对target_array进行排序,各元素按值由低到高的顺序排列。注意,它不返回排序后的数组。相反,它只是“就地”对数组排序,不论结果如何都不返回任何值。sort_flags参数可选,将根据这个参数指定的值修改该函数的默认行为。
● SORT_NUMBERIC:按数值排序。对整数或浮点数排序时很有用。
● SORT_REGULAR:按照相应的ASCII值对元素排序。例如,这意味着B在a的前面。在网上很快就能查到很多ASCII表,所以这本书就不再列出。
● SORT_STRING:按接近于人所认知的正确顺序对元素排序。有关的更多信息请参照本节后面介绍的natsort()。
考虑一个例子。假设希望由低到高对考试成绩进行排序:
![]()
结果将是:
![]()
值得注意的一点是,键/值关联不再保持。考虑下列例子:
![]()
输出如下:
![]()
要保持这些关联,请使用本节后面将介绍的asort()。
2. natsort()
![]()
natsort()函数提供了一种相当于人们平常使用的排序机制。PHP手册对我们所用的排序策略提供了一个绝佳的例子,这里借用一下。考虑如下各项:picture1.jpg、picture2.jgp、picture10.jpg和picture20.jpg。使用典型的算法对这些项排序将得到以下顺序:
![]()
肯定不是你所期望的,对吧?natsort()函数解决了这个难题,它会以你期望的顺序排列target_array,如下:
![]()
3. natcasesort()
![]()
函数natcasesort()在功能上与natsort()相同,只是它不区分大小写。再来看5.9.2节中文件排序的难题,假设图片的文件名如下:Picture1.JPG、picture2.jpg、PICTURE10.jpg、picture20.jpg。natsort()函数“尽其所能”也只能得取如下顺序:
![]()
而natcasesort()函数将解决这个问题,会如你所愿地进行排序:
![]()
4. rsort()
![]()
rsort()函数与sort()相同,只是它以相反的顺序(降序)对数组元素排序。示例如下:

如果包括了可选的sort_flags参数,那么具体的排序行为将由这个值来确定,请参见5.9.1节中的解释。
5. asort()
![]()
asort()函数与sort()相同,以升序排序target_array,只是它将保持键/值的关联。考虑一个数组,其中包含以加入联邦的时间顺序排列的州:
![]()
使用sort()排序将丢掉键/值的关联,这可不好。使用sort()将得到下面的结果:
![]()
但是,使用asort()排序将得到:
![]()
如果使用可选的sort_flags参数,具体的排序行为将由这个值来确定,请参见5.9.1节中的解释。
6. array_multisort()
![]()
array_multisort()函数可以一次对多个数组进行排序,还可以按多种方式对多维数组进行排序,成功时返回TRUE,否则返回FALSE。它接受一个或多个数组作为输入,每个数组都有一个确定排序行为的标志。有两类排序标志:顺序和类型。表5-1中描述了各个标志。
表5-1 array_multisort()标志
|
标 志 |
类 型 |
目 的 |
|
SORT_ASC |
顺序 |
以升序排列 |
|
SORT_DESC |
顺序 |
以降序排列 |
|
SORT_REGULAR |
类型 |
正常比较数组元素 |
|
SORT_NUMERIC |
类型 |
按数值顺序比较数组元素 |
|
SORT_STRING |
类型 |
按字符串比较数组元素 |
下面考虑一个例子。假设希望对一个包含员工信息的多维数组中“姓”一列进行排序。为确保正确地对整个名(名和姓)排序,然后还要按“名”进行排序。

这将返回如下结果:

7. arsort()
![]()
与asort()一样,arsort()会保持键/值的关联。但是,它以逆序对数组排序。示例如下:

如果包括了可选的sort_flags参数,具体的排序行为将由这个值来确定,请参考5.9.1节中的解释。
8. ksort()
![]()
ksort()函数按键对输入数组array排序,成功后返回TRUE,失败则返回FALSE。如果包括了可选的sort_flags参数,具体的排序行为将由这个值来确定,请参考5.9.1节中的解释。记住,排序行为将应用到键排序,而不是值排序。
9. krsort()
![]()
krsort()函数与ksort()相同,也会按键排序,只是它会以逆序(降序)排列。
10. usort()
![]()
利用usort()函数,可以使用嵌入到函数中的用户自定义比较算法来对一个数组排序。如果需要某种方式对数据排序,而PHP内置的排序函数没有提供相应的支持,这个函数就很有用。
用户自定义函数必须接受两个输入参数,根据第一个参数小于、等于或大于第二个参数,相应地返回一个负整数、0或正整数。很显然,这个函数必须与usort()调用在相同的作用域内。
例如,对美国格式的日期(月—日—年,与大多数国家使用的日—月—年不同)进行排序,就是使用usort()的一个特别有用的例子。假设希望以升序对一个日期数组排序:


这将返回我们所期望的结果:
![]()







