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设置来把元素当作字符串比较。html

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()是用“天然排序”算法对数组进行不区分大小写字母的排序。这两个函数使用的代码以下所示:app

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()函数比较每个字符串的个数,而后分别返回一、0或-1,这个返回值是决定元素排列的基础。spa

⑥多维数组的排序code

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中最有用的函数之一,它有很是普遍的应用范围。另外,正如你在例子中看到的,它能对多个不相关的数组进行排序,也能够使用其中一个元素做为下次排序的基础,还能够对数据库结果集进行排序。

 
相关文章
相关标签/搜索