首页 > 代码库 > PHP数组的排序函数

PHP数组的排序函数

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

 

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

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