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 相关文章推荐
How do I change MySQL timezone?
Mar 26 PHP
PHP file_get_contents 函数超时的几种解决方法
Jul 30 PHP
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP自定义错误处理的方法分析
Dec 19 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 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
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js+css在交互上的应用
2010/07/18 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
python 调用c语言函数的方法
2017/09/29 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
伊琍体标语
2014/06/25 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
上课说话检讨书
2015/01/27 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js