PHP数组的排序函数
对保存在数组中的相关数据进行排序是一件非常有意义的事情。在PHP中提供了很多函数可以对数组进行排序,这些函数提供了多种排序的方法。例如,可以通过元素的值或键及自定义排序等。

①简单的数组排序函数
简单的数组排序,是对一个数组元素的值进行排序,PHP的sort()函数和rsort()函数实现了这个功能。这两个函数既可以按数字大小排列也可以按照字母顺序排列,并具有相同的参数列表。其函数原型分别如下:
bool sort(array &array[,int sort_flags])
bool rsort(array &array[,int sort_flags])
第一个参数是必须的。后一个参数是可选的,给出了排序的方式,可以用以下值改变排序的行为。
SORT_REGULAR:是默认值,将自动识别数组元素的类型进行排序。
SORT_NUMERIC:用于数字元素的排序。
SORT_STRING:用于字符串元素的排序。
SORT_LOCALE_STRING:根据当前的locale设置来把元素当做字符串比较。
sort()函数对数组中的元素值按照由小到大顺序进行排序,rsort()函数则按照由大到小的顺序对元素的值进行排序。这两个函数使用的代码如下所示:
|
1
2
3
4
5
6
7
8
9
|
<?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($data);print_r($data); //输出:Array([0]=>8 [1]=>7 [2]=>5 [3]=>2 [4]=>1)?> |
②根据键名对数组排序
当我们使用数组时,经常会根据键名对数组重新排序,ksort()函数和krsort()函数实现了这个功能。ksort函数对数组按照键名进行由小到大的排序,krsort()函数和ksort()函数相反,排序后为数组值保留原来的键。
③根据元素的值对数组排序
如果你想使用数组中元素的值进行排序来取代键值排序,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了,如果按照从大到小排序,可以使用arsort()函数。前面介绍过简单的排序函数sort()函数和rsort()函数,也是根据元素的值对数组进行排序,单原始键名将被忽略,而依序使用数字重新索引数组的下标。而asort()函数和arsort()函数将保留原有键名和值得关系。
④根据“自然排序”法对数组排序
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则,这种特性成为“自然排序法”,即数字从1到9的排序方法,字母从a到z的排序方法,短者优先。当创建模糊逻辑应用软件时这种排序方式非常有用。可以使用natsort()进行“自然排序”法的数组排序,该函数的排序结果时忽略键名的。函数natcasesort()是用“自然排序”算法对数组进行不区分大小写字母的排序。这两个函数使用的代码如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php$data = array("file1.txt","file11.txt","File2.txt","FILE12.txt","file.txt");natsort($data); //普通的自然排序print_r($data); //输出排序后的结果,数组中包括大小写,输出不是正确的排序结果/*运行结果:Array([3]=>FILE12.txt //大写的元素排在了前面[2]=>File2.txt[4]=>file.txt[0]=>file1.txt[1]=>file11.txt)*/natcasesort($data); //忽略大小写的“自然排序”print_r($data); //输出“自然排序”后的结果,正常结果/*运行结果Array( //使用natcasesort()函数忽略大小写的“自然排序”后的结果[4]=>file.txt [0]=>file1.txt[2]=>File2.txt[1]=>file11.txt[3]=>FILE12.txt)*/?> |
⑤根据用户自定的规则对数组排序
PHP提供了可以通过创建你自己的比较函数作为回调函数的数组排序函数,包括usort()、uasort()和uksort等函数。他们的使用格式一样,并具有相同的参数列表,区别在于对键还是值进行排序。其函数原型分别如下:
bool usort(array &array,callback cmp_function)
bool uasort(array &array,callback cmp_function)
bool ursort(array &array,callback cmp_function)
这三个函数将用用户自定义的比较函数对一个数组中的值进行排序。入股偶要排序的数组需要用一种不寻常的标准进行排序,那么应该使用这几个函数。在自定义的回调函数中,需要两个参数,分别依次传入数组中连续的两个元素。比较函数必须在第一个参数被认为小于、等于或大于第二个参数时分别返回一个小于,等于或大于零的整数。在下面的例子中就根据数组中元素的长度对数组进行排序,最短项放在最前面。代码如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php//声明一个数组,其中元素值得长度不相同$lamp = array("Linux","Apache","MySQL","php");//使用usort()函数传入用户自定义的回调函数进行数组排序usort($lamp,"sortByLen");print_r($lamp);//自定义的函数作为回调函数提供给usort()函数使用,声明排序规则function sortByLen($one,$two){//如果两个参数长度相等返回0,在数组中的位置不变if(strlen($one) == strlen($two))return 0;else//第一个参数大于第二个参数返回大于0的数,否则返回小于0的数return (strlen($one)>strlen($two)) ? 1 : -1;}//运行结果 Array([0]=>php [1]=MySQL [2]=>Linux [3]=>Apache)?> |
上例的代码中,创建了自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1、0或-1,这个返回值是决定元素排列的基础。
⑥多维数组的排序
PHP也允许在多维数组上执行一些比较复杂的排序。例如,首先对一个嵌套数组使用一个普通的键值进行排序,然后再根据另一个键值进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。可以使用array_multisort()函数对多个数组或多维数组进行排序,后者根据某一维或多维对多维数组进行排序。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php//声明一个$data数组,模拟了一个行和列数组$data = array(array("id"=>1,"soft"=>"Linux","rating"=>3),array("id"=>2,"soft"=>"Apache","rating"=>1),array("id"=>3,"soft"=>"MySQL","rating"=>4),array("id"=>4,"soft"=>"PHP","rating"=>2),);//foreach遍历创建两个数组$soft和rating,作为array_multisort的参数foreach($data as $key =>$value){$soft[$key] = $value ["soft"]; //将$data中的每个数组元素中键值为soft的值形成数组$soft$rating[$key] = $value["rating"]; //将每个数组元素中键值为rating的值形成数组$rating}array_multisort($rating,$soft,$data); //使用array_multisort()函数传入三个数组进行排序print_r($data); //输出排序后的二维数组/*运行结果array([0]=>Array([id]=>2 [soft]=>Apache [rating]=>1)[1]=>Array([id]=>4 [soft]=>PHP [rating]=>2)[2]=>Array([id]=>1 [soft]=>Linux [rating]=>3)[3]=>Array([id]=>3 [soft]=>MySQL [rating]=>4))*/?> |
上面的程序中在$data数组中模拟了一个行和列数组。然后使用array_multisort()函数对数据集合进行重新排序,首先根据$rating数组中的键值进行排序,然后,如果$rating中的元素值相等,再根据$soft数组进行排序。
array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,正如你在例子中看到的,它能对多个不相关的数组进行排序,也可以使用其中一个元素作为下次排序的基础,还可以对数据库结果集进行排序。
PHP数组的排序函数的更多相关文章
- php回调函数数组的排序函数
array_filter() array_map() sort()升序不保存key resort() asort()升序保存key arsort() ksort()根据key排序 krsort()
- php 数组的常用函数
在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数 * * 数组的排序函 ...
- PHP数组的常用函数
在PHP中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数 * * 数组的排序函数 ...
- PHP常用的数组相关处理函数
[数组中常用的多种遍历方式] [for 和 foreach 略] [while() . list() .each() 组合循环遍历数组] each()函数 a. 需要一个数组作为参数 b. 返回来的也 ...
- Js 数组对象排序
1.定义函数 /** * 数组对象排序函数 * @param {any} name 排序字段 * @param {any} order 升.降(这里事true.false记得处理下) */ var b ...
- PHP基础-常用的数组相关处理函数
一 数组键/值操作有关的函数 1. array_values()//获取数组中所有的值 $lamp=array("os"=>"linux", " ...
- php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)
测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...
- php array_multisort函数实现按某一字段对二维数组进行排序
在工作中碰到一个页面如表格似的展示多条数据,要求根据其中的修改时间对数据进行排序, 数据格式类似于 $a = array( 0=>array( editTime=>'' addTime=& ...
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
随机推荐
- ANTLR
http://dreamhead.blogbus.com/logs/10756716.html
- Xamarin.Forms App Settings
配合James Montemagno的Component [Settings Plugin],实现Xamarin.Forms的设置. 更新系统配置且不需要进行重启app. 方式一xml Xamarin ...
- HDU_1174——爆头,空间直线方程,直线到点的距离
Problem Description gameboy是一个CS高手,他最喜欢的就是扮演警察,手持M4爆土匪的头.也许这里有人没玩过CS,有必要介绍一下“爆头”这个术语:所谓爆头,就是子弹直接命中对方 ...
- Google Code Jam 2012 round 2 problem A: Swinging Wild
题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...
- 简单javaEE思维导图
- 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!
关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...
- 一条sql
包含全部:SELECT u.id,u.user_name,usa.fixed_amount,d.uloadtype,d.min_loan_money FROM fanwe_user_autobid u ...
- Uncaught SyntaxError : Unexpected token ILLEGAL js传递带空格的参数
通常在页面中要让某些内容点击后产生点击事件(非页面跳转)都会使用onclick,但是这样不适于需要传递参数的情况,于是写成直接调用JavaScript函数的方式:<a href=javascri ...
- 将16进制颜色转换成UIColor-ios
-(UIColor *) hexStringToColor: (NSString *) stringToConvert { NSString *cString = [[stringToConvert ...
- CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序
http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...