对保存在数组中的相关数据进行排序是一件非常有意义的事情。在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中最有用的函数之一,它有非常广泛的应用范围。另外,正如你在例子中看到的,它能对多个不相关的数组进行排序,也可以使用其中一个元素作为下次排序的基础,还可以对数据库结果集进行排序。

 

>> 本文固定链接: http://php.ncong.com/php_course/arry_function/array_paixu.html

>> 转载请注明: 恩聪php 2014年04月13日 于 恩聪PHP学习教程 发表

PHP数组的排序函数的更多相关文章

  1. php回调函数数组的排序函数

    array_filter() array_map() sort()升序不保存key resort() asort()升序保存key arsort() ksort()根据key排序 krsort()

  2. php 数组的常用函数

    在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数  *  * 数组的排序函 ...

  3. PHP数组的常用函数

    在PHP中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数  *  * 数组的排序函数 ...

  4. PHP常用的数组相关处理函数

    [数组中常用的多种遍历方式] [for 和 foreach 略] [while() . list() .each() 组合循环遍历数组] each()函数 a. 需要一个数组作为参数 b. 返回来的也 ...

  5. Js 数组对象排序

    1.定义函数 /** * 数组对象排序函数 * @param {any} name 排序字段 * @param {any} order 升.降(这里事true.false记得处理下) */ var b ...

  6. PHP基础-常用的数组相关处理函数

    一 数组键/值操作有关的函数 1. array_values()//获取数组中所有的值 $lamp=array("os"=>"linux", " ...

  7. php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)

    测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...

  8. php array_multisort函数实现按某一字段对二维数组进行排序

    在工作中碰到一个页面如表格似的展示多条数据,要求根据其中的修改时间对数据进行排序, 数据格式类似于 $a = array( 0=>array( editTime=>'' addTime=& ...

  9. FCL源码中数组类型的学习及排序函数Sort函数的分析

    Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点    能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...

随机推荐

  1. Java was started but returned exit code=13

    安装Eclipse(32位)后打开报错:Java was started but returned exit code=13 解决方法: 1,首先我查看了我当前安装的JDK版本,发现是64位的: 2, ...

  2. JS操作css的float属性的特殊写法

    使用js操作css属性的写法是有一定的规律的: 1.对于没有中划线的css属性一般直接使用style.属性名即可. 如:obj.style.margin,obj.style.width,obj.sty ...

  3. Backward_chaining

    http://en.wikipedia.org/wiki/Backward_chaining

  4. ural 1613 For Fans of Statistics

    #include <cstdio> #include <cstring> #include <map> #include <vector> #inclu ...

  5. Android中设置文字大小的定义类型

    在Android中所有的组件可以设置大小,但是在设置大小的时候需要指定其单位,这些单位如下: px(pixels):像素: dip(device independent pixels):依赖于设备的像 ...

  6. 两表关联更新,用于update 回滚

    create table test1 as select * from dba_objects; create table test2 as select * from dba_objects; cr ...

  7. 2014-07-25 改进自定义菜单与使用SVN进行协同开发

    今天是在吾索实习的第13天.今天没有做过多的代码设计,只进行了一些代码的分析与进一步优化.其中,发现创建自定义菜单的关键代码书写可分为两部分: JSON格式的字符串在.net中的语法书写: strin ...

  8. 转载-常用API接口签名验证参考

    原文地址: http://www.cnblogs.com/hnsongbiao/p/5478645.html 写的很好,就做个笔记了.感谢作者! 项目中常用的API接口签名验证方法: 1. 给app分 ...

  9. gcc编译时头文件库文件搜索顺序(转)

    原文: http://blog.csdn.net/silentfly1987/article/details/6119195

  10. chinaOS

    从舆论上和政策规定上来推广操作系统,这对国产操作系统而言是好事,还是坏事? 从某种程度上来说,这是好事 运用行政的力量,率先在国家机关中普及国产操作系统确实是件好事,首先是确保了国家信息安全,其次则能 ...