对数组进行排序
PHP 有一些用来排序数组的函数, 这个文档会把它们列出来。
主要区别有:
-
有些函数基于 array 的键来排序,
而其他的基于值来排序的:
$array['key'] = 'value';
。 - 排序之后键和值之间的关联关系是否能够保持, 是指排序之后数组的键可能 会被重置为数字型的(0,1,2 ...)。
- 排序的顺序有:字母表顺序, 升序(由低到高), 降序(由高到低),数字排序,自然排序,随机顺序或者用户自定义排序。
- 注意:下列的所有排序函数都是直接作用于数组本身, 而不是返回一个新的有序的数组。
- 以下函数对于数组中相等的元素,会保留原有的排序。 在 PHP 8.0.0 之前,它们排序后的顺序是未定义的(也即相等元素之间的顺序是不稳定的)。
函数名称 | 排序依据 | 数组索引键保持 | 排序的顺序 | 相关函数 |
---|---|---|---|---|
array_multisort() | 值 | string 键保持不变,int 键重新索引 | 第一个数组或者由选项指定 | array_walk() |
asort() | 值 | 是 | 升序 | arsort() |
arsort() | 值 | 是 | 降序 | asort() |
krsort() | 键 | 是 | 降序 | ksort() |
ksort() | 键 | 是 | 升序 | krsort() |
natcasesort() | 值 | 是 | 自然排序,大小写不敏感 | natsort() |
natsort() | 值 | 是 | 自然排序 | natcasesort() |
rsort() | 值 | 否 | 降序 | sort() |
shuffle() | 值 | 否 | 随机 | array_rand() |
sort() | 值 | 否 | 升序 | rsort() |
uasort() | 值 | 是 | 由用户定义 | uksort() |
uksort() | 键 | 是 | 由用户定义 | uasort() |
usort() | 值 | 否 | 由用户定义 | uasort() |

User Contributed Notes 3 notes
"Matthew Rice" ¶
9 years ago
While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.
The following code:
<?php
function usortTest($a, $b) {
var_dump($a);
var_dump($b);
return -1;
}
$test = array('val1');
usort($test, "usortTest");
$test2 = array('val2', 'val3');
usort($test2, "usortTest");
?>
Will output:
string(4) "val3"
string(4) "val2"
The first array doesn't get sent to the function.
Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.
oculiz at gmail dot com ¶
11 years ago
Another way to do a case case-insensitive sort by key would simply be:
<?php
uksort($array, 'strcasecmp');
?>
Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.
Hayley Watson ¶
5 years ago
Stabilizing the sort functions (in this case, usort).
<?php
function stable_usort(&$array, $cmp)
{
$i = 0;
$array = array_map(function($elt)use(&$i)
{
return [$i++, $elt];
}, $array);
usort($array, function($a, $b)use($cmp)
{
return $cmp($a[1], $b[1]) ?: ($a[0] - $b[0]);
});
$array = array_column($array, 1);
}
?>
Tags each array element with its original position in the array so that when the comparison function returns 0 the tie can be broken to put the earlier element first.