PHP数组排序函数有哪些

一、总结

一句话总结:其实也就是是否保持索引,对键排序还是对值排序,除了sort,rsort.shuffle,usort外,都是保持索引的

是否保持索引 键排序 值排序
除了sort,rsort.shuffle,usort外,都是保持索引的

  1、a(association)前缀表示以键值关联排序;

  2、k(key)前缀表示以键名关联排序;

  3、r(reverse)前缀表示以反方向排序。

 

排序函数属性

函数名称

排序依据

数组索引键保持

排序的顺序

相关函数

​array_multisort()​

键值关联的保持,数字类型的不保持

第一个数组或者由选项指定

​array_walk()​

​asort()​

由低到高

​arsort()​

​arsort()​

由高到低

​asort()​

​krsort()​

由高到低

​ksort()​

​ksort()​

由低到高

​asort()​

​natcasesort()​

自然排序,大小写不敏感

​natsort()​

​natsort()​

自然排序

​natcasesort()​

​rsort()​

由高到低

​sort()​

​shuffle()​

随机

​array_rand()​

​sort()​

由低到高

​rsort()​

​uasort()​

由用户定义

​uksort()​

​uksort()​

由用户定义

​uasort()​

​usort()​

由用户定义

​uasort()​

 


 


 

 

1、排序sort函数中的前缀a/k/r/u分别代表什么意思?

a-association k-key r-reverse u-user

  1、a(association)前缀表示以键值关联排序;

  2、k(key)前缀表示以键名关联排序;

  3、r(reverse)前缀表示以反方向排序。

 

 

 

二、PHP 数组排序函数sort,rsort,ksort,krsort,asort,arsort区别

一、概念:

    1、自然排序法:即按自然数的大小排序,例如“10>2”;

    2、计算机标准排序法:是以逐个字符比较,排序,例如“2>10”(因为第一位2>1);

    3、数值数组:带有数字 ID 键的数组;

    4、关联数组:带有指定的键的数组,每个键关联一个值。

    5、默认的排序为按键值升序排序,排序方式为自然排序。

二、【帮助理解】

  1、a(association)前缀表示以键值关联排序;

  2、k(key)前缀表示以键名关联排序;

  3、r(reverse)前缀表示以反方向排序。

三、排序

例子:



1     $arr = array("Ben"=>"2","peter"=>"10","Joe"=>"30");
2 echo "-------------echo array-------------<br>";
3 foreach ($arr as $key => $value) {
4 # code...
5 echo "key= ".$key.",value= ".$value."<br>";
6 }


1、排序数值数组:

  1)、sort:默认的排序,即按键值升序排序,因为该函数用于排序一维数组,所有排序出来的键名会被重新规定,关联数组用此方法排序,则关联数组的键名不被保留,换成的是数字键。

  2)、rsort:该函数与sort函数用法类似,不同的是按键值逆序排序。



1     echo "-------------sorts by sort-------------<br>";
2 sort($arr);
3 foreach ($arr as $key => $value) {
4 # code...
5 echo "key= ".$key.",value= ".$value."<br>";
6 }
7
8 echo "-------------sorts by rsort-------------<br>";
9 rsort($arr);
10 foreach ($arr as $key => $value) {
11 # code...
12 echo "key= ".$key.",value= ".$value."<br>";
13 }


输出结果:

-------------echo array-------------

key= Ben,value= 2

key= peter,value= 10

key= Joe,value= 30

-------------sorts by sort-------------

key= 0,value= 2

key= 1,value= 10

key= 2,value= 30

-------------sorts by rsort-------------

key= 0,value= 30

key= 1,value= 10

key= 2,value= 2

2、排序关联数组:

关联数组的排序有两种排序项,第一种以数组的键名排序,第二种以数组的键值排序。

    按键名排序:

        1)、ksort:按关联数组的键名升序排序,排序的结果保留键值的关联关系。

        2)、krsort:按关联数组的键名逆序排序,排序的结果保留键值的关联关系。



1     echo "-------------sorts by ksort--------------<br>";
2 ksort($arr);
3 foreach ($arr as $key => $value) {
4 # code...
5 echo "key= ".$key.",value= ".$value."<br>";
6 }
7
8 echo "-------------sorts by krsort-------------<br>";
9 krsort($arr);
10 foreach ($arr as $key => $value) {
11 # code...
12 echo "key= ".$key.",value= ".$value."<br>";
13 }


 输出结果:

-------------echo array-------------

key= Ben,value= 2

key= peter,value= 10

key= Joe,value= 30

-------------sorts by ksort--------------

key= Ben,value= 2

key= Joe,value= 30

key= peter,value= 10

-------------sorts by krsort-------------

key= peter,value= 10

key= Joe,value= 30

key= Ben,value= 2  

  按键值排序:

        1)、asort:按关联数组的键值升序排序,排序的结果保留键值的关联关系

        2)、arsort:按关联数组的键值逆序排序,排序的结果保留键值的关联关系。



1     echo "-------------sorts by asort-------------<br>";
2 asort($arr);
3 foreach ($arr as $key => $value) {
4 # code...
5 echo "key= ".$key.",value= ".$value."<br>";
6 }
7
8 echo "-------------sorts by arsort-------------<br>";
9 arsort($arr);
10 foreach ($arr as $key => $value) {
11 # code...
12 echo "key= ".$key.",value= ".$value."<br>";
13 }


输出结果:

-------------echo array-------------

key= Ben,value= 2

key= peter,value= 10

key= Joe,value= 30

-------------sorts by asort-------------

key= Ben,value= 2

key= peter,value= 10

key= Joe,value= 30

-------------sorts by arsort-------------

key= Joe,value= 30

key= peter,value= 10

key= Ben,value= 2


 


三、用户自定义排序函数

参考:PHP: 对数组进行排序 - Manual

https://www.php.net/manual/zh/array.sorting.php



PHP 有一些用来排序数组的函数, 这个文档会把它们列出来。

主要区别有:

  • 有些函数基于 ​​array​​ 的键来排序, 而其他的基于值来排序的:$array['key'] = 'value';
  • 排序之后键和值之间的关联关系是否能够保持, 是指排序之后数组的键可能 会被重置为数字型的(0,1,2 ...)。
  • 排序的顺序有:字母表顺序, 由低到高(升序), 由高到低(降序),数字排序,自然排序,随机顺序或者用户自定义排序。
  • 注意:下列的所有排序函数都是直接作用于数组本身, 而不是返回一个新的有序的数组。
  • 以下函数对于数组中相等的元素,它们在排序后的顺序是未定义的。 (也即相等元素之间的顺序是不稳定的)。

排序函数属性

函数名称

排序依据

数组索引键保持

排序的顺序

相关函数

​array_multisort()​

键值关联的保持,数字类型的不保持

第一个数组或者由选项指定

​array_walk()​

​asort()​

由低到高

​arsort()​

​arsort()​

由高到低

​asort()​

​krsort()​

由高到低

​ksort()​

​ksort()​

由低到高

​asort()​

​natcasesort()​

自然排序,大小写不敏感

​natsort()​

​natsort()​

自然排序

​natcasesort()​

​rsort()​

由高到低

​sort()​

​shuffle()​

随机

​array_rand()​

​sort()​

由低到高

​rsort()​

​uasort()​

由用户定义

​uksort()​

​uksort()​

由用户定义

​uasort()​

​usort()​

由用户定义

​uasort()​


 


 


1、usort




usort — 使用用户自定义的比较函数对数组中的值进行排序



说明


usort ( array ​​&$array​​ , ​​callable​​ ​​$value_compare_func​​ ) : bool


本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。

Note:

If two members compare as equal, their relative order in the sorted array is undefined.

Note: 此函数为 ​​array​​ 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。



参数

​array​

输入的数组

​cmp_function​

在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。


callback ( ​​mixed​​ ​​$a​​, ​​mixed​​ ​​$b​​ ) : int


Caution

Returning non-integer values from the comparison function, such as ​​float​​, will result in an internal cast to ​​integer​​ of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.



返回值

成功时返回 ​TRUE​, 或者在失败时返回 ​FALSE​。


 




Example #2 使用多维数组的 usort() 例子

<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
echo "$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
当排序多维数组时,$a 和 $b 包含到数组第一个索引的引用。

以上例程会输出:

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons


 

php闭包

多维数组排序




Example #4 usort() example using a closure to sort a multi-dimensional array

<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');

function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}

usort($array, build_sorter('key_b'));

foreach ($array as $item) {
echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>
以上例程会输出:

y, a
x, b
z, c