首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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()的一个特别有用的例子。假设希望以升序对一个日期数组排序:

这将返回我们所期望的结果:

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论