一、总结
一句话总结:其实也就是是否保持索引,对键排序还是对值排序,除了sort,rsort.shuffle,usort外,都是保持索引的
是否保持索引 键排序 值排序
除了sort,rsort.shuffle,usort外,都是保持索引的
1、a(association)前缀表示以键值关联排序;
2、k(key)前缀表示以键名关联排序;
3、r(reverse)前缀表示以反方向排序。
排序函数属性
函数名称 | 排序依据 | 数组索引键保持 | 排序的顺序 | 相关函数 |
值 | 键值关联的保持,数字类型的不保持 | 第一个数组或者由选项指定 | ||
值 | 是 | 由低到高 | ||
值 | 是 | 由高到低 | ||
键 | 是 | 由高到低 | ||
键 | 是 | 由低到高 | ||
值 | 是 | 自然排序,大小写不敏感 | ||
值 | 是 | 自然排序 | ||
值 | 否 | 由高到低 | sort() | |
值 | 否 | 随机 | ||
sort() | 值 | 否 | 由低到高 | |
值 | 是 | 由用户定义 | ||
键 | 是 | 由用户定义 | ||
值 | 否 | 由用户定义 |
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 ...)。
- 排序的顺序有:字母表顺序, 由低到高(升序), 由高到低(降序),数字排序,自然排序,随机顺序或者用户自定义排序。
- 注意:下列的所有排序函数都是直接作用于数组本身, 而不是返回一个新的有序的数组。
- 以下函数对于数组中相等的元素,它们在排序后的顺序是未定义的。 (也即相等元素之间的顺序是不稳定的)。
排序函数属性
函数名称 | 排序依据 | 数组索引键保持 | 排序的顺序 | 相关函数 |
值 | 键值关联的保持,数字类型的不保持 | 第一个数组或者由选项指定 | ||
值 | 是 | 由低到高 | ||
值 | 是 | 由高到低 | ||
键 | 是 | 由高到低 | ||
键 | 是 | 由低到高 | ||
值 | 是 | 自然排序,大小写不敏感 | ||
值 | 是 | 自然排序 | ||
值 | 否 | 由高到低 | sort() | |
值 | 否 | 随机 | ||
sort() | 值 | 否 | 由低到高 | |
值 | 是 | 由用户定义 | ||
键 | 是 | 由用户定义 | ||
值 | 否 | 由用户定义 |
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