PHP下对数组进行排序的函数


Posted in PHP onAugust 08, 2010

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。
简单排序
首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:
Listing A

<?php 
$data = array(5,8,1,7,2); 
sort($data); 
print_r($data); 
?>

输出结果如下所示:
Array ([0] => 1 
[1] => 2 
[2] => 5 
[3] => 7 
[4] => 8 
)

也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。Listing B给我们展示了它的一个例子:
Listing B
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data); 
?>

它的输出结果如下:
Array ([0] => 8 
[1] => 7 
[2] => 5 
[3] => 2 
[4] => 1 
)

根据关键字排序
当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是一个例子:
Listing C
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);ksort($data); print_r($data); 
?>

它的输出结果如下:
Array ([DE] => Germany 
[ES] => Spain 
[IN] => India 
[US] => United States 
)

Krsort()函数是根据关键字对数组进行倒排,Listing D就是这样的例子:
Listing D
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);krsort($data); print_r($data); 
?>

它的输出结果如下:
Array ([US] => United States 
[IN] => India 
[ES] => Spain 
[DE] => Germany 
)

根据值排序
如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所示:
Listing E
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);asort($data); print_r($data); 
?>

下面就是它的输出结果。请注意这个结果与上面使用ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进行排序的,但是它们是根据数组的不同字段进行排序的。
同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的一种方式,排序并不会改变它们的对应关系。
Array ([DE] => Germany
[IN] => India
[ES] => Spain
[US] => United States
)
现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。Listing F就是一个例子:
Listing F
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);arsort($data); print_r($data); 
?>

下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。
Array ([US] => United States 
[ES] => Spain 
[IN] => India 
[DE] => Germany 
)

自然语言排序
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:
Listing G
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″); sort($data);print_r($data); 
natsort($data); print_r($data);?>

它的输出结果如下:
Array ([0] => book-1 
[1] => book-10 
[2] => book-100 
[3] => book-5 
) 
Array 
( 
[0] => book-1 
[3] => book-5 
[1] => book-10 
[2] => book-100 
)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。
自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:
Listing H
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″);natsort($data); print_r(array_reverse($data)); 
?>

下面是它的输出结果:
Array ([0] => book-100 
[1] => book-10 
[2] => book-5 
[3] => book-1 
)

根据用户自定义的规则排序
PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。
Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:
Listing I
<?php $data = array(“joe@host.com”, “john.doe@gh.co.uk”, “asmithsonian@us.info”, “jay@zoo.tw”);usort($data, ‘sortByLen'); 
print_r($data); function sortByLen($a, $b) { 
if (strlen($a) == strlen($b)) { 
return 0; 
} else { 
return (strlen($a) > strlen($b)) ? 1 : -1; 
} 
} 
?>

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:
Array ([0] => jay@zoo.tw 
[1] => joe@host.com 
[2] => john.doe@gh.co.uk 
[3] => asmithsonian@us.info 
)

自然语言排序
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:
Listing G
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″); sort($data);print_r($data); 
natsort($data); print_r($data);?>

它的输出结果如下:
Array ([0] => book-1 
[1] => book-10 
[2] => book-100 
[3] => book-5 
) 
Array 
( 
[0] => book-1 
[3] => book-5 
[1] => book-10 
[2] => book-100 
)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。
自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:
Listing H
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″);natsort($data); print_r(array_reverse($data)); 
?>

下面是它的输出结果:
Array ([0] => book-100 
[1] => book-10 
[2] => book-5 
[3] => book-1 
)

根据用户自定义的规则排序
PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。
Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:
Listing I
<?php $data = array(“joe@host.com”, “john.doe@gh.co.uk”, “asmithsonian@us.info”, “jay@zoo.tw”);usort($data, ‘sortByLen'); 
print_r($data); function sortByLen($a, $b) { 
if (strlen($a) == strlen($b)) { 
return 0; 
} else { 
return (strlen($a) > strlen($b)) ? 1 : -1; 
} 
} 
?>

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:
Array ([0] => jay@zoo.tw 
[1] => joe@host.com 
[2] => john.doe@gh.co.uk 
[3] => asmithsonian@us.info 
)

多维排序
最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:
Listing J
<?php $data = array(array(“id” => 1, “name” => “Boney M”, “rating” => 3), 
array(“id” => 2, “name” => “Take That”, “rating” => 1), 
array(“id” => 3, “name” => “The Killers”, “rating” => 4), 
array(“id” => 4, “name” => “Lusain”, “rating” => 3), 
); foreach ($data as $key => $value) { 
$name[$key] = $value['name']; 
$rating[$key] = $value['rating']; 
} 
array_multisort($rating, $name, $data); print_r($data);?>

这里,我们在$data数组中模拟了一个行和列数组。然后,我使用array_multisort()函数对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下:
Array ([0] => Array 
( 
[id] => 2 
[name] => Take That 
[rating] => 1 
) [1] => Array 
( 
[id] => 1 
[name] => Boney M 
[rating] => 3 
) 
[2] => Array 
( 
[id] => 4 
[name] => Lusain 
[rating] => 3 
) 
[3] => Array 
( 
[id] => 3 
[name] => The Killers 
[rating] => 4 
) 
)

array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。
这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。
PHP 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
CURL状态码列表(详细)
Jun 27 PHP
php下拉选项的批量操作的实现代码
Oct 14 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php创建sprite
Feb 11 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP 冒泡排序算法的实现代码
Aug 08 #PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 #PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 #PHP
PHP下escape解码函数的实现方法
Aug 08 #PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 #PHP
PHP MemCached高级缓存配置图文教程
Aug 05 #PHP
PHP Array交叉表实现代码
Aug 05 #PHP
You might like
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php操作mongoDB实例分析
2014/12/29 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python使用插值法画出平滑曲线
2018/12/15 Python
python使用thrift教程的方法示例
2019/03/21 Python
python实现名片管理系统项目
2019/04/26 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
ktv收银员岗位职责
2013/12/16 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
家庭困难证明
2014/10/12 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python