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 相关文章推荐
在PWS上安装PHP4.0正式版
Oct 09 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
PHP图片上传代码
Nov 04 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP微信红包生成代码分享
Oct 06 PHP
php获取linux命令结果的实例
Mar 13 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 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/01/01 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
php四种定界符详解
2017/02/16 PHP
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
jquery replace方法去空格
2017/05/08 jQuery
详解React 16 中的异常处理
2017/07/28 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
js断点调试经验分享
2017/12/08 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
python安装教程 Pycharm安装详细教程
2017/05/02 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Django如何实现上传图片功能
2019/08/16 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
工地安全检查制度
2014/02/04 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
初婚初育证明范本
2015/06/18 职场文书
大学生读书笔记范文
2015/07/01 职场文书
2015年教师节感言
2015/08/03 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书