先说说数组排序函数的主要特点和区别:
排序函数属性比较
函数名称 | 排序依据 | 数组索引键保持 | 排序的顺序 |
---|---|---|---|
array_multisort() | 值 | string 键保持不变,int 键重新索引 | 第一个数组或由选项指定 |
asort() | 值 | 是 | 升序 |
arsort() | 值 | 是 | 降序 |
krsort() | 键 | 是 | 降序 |
ksort() | 键 | 是 | 升序 |
natcasesort() | 值 | 是 | 自然排序,不区分大小写 |
natsort() | 值 | 是 | 自然排序 |
rsort() | 值 | 否 | 降序 |
sort() | 值 | 否 | 升序 |
shuffle() | 值 | 否 | 随机 |
uasort() | 值 | 是 | 由用户定义 |
uksort() | 键 | 是 | 由用户定义 |
usort() | 值 | 否 | 由用户定义 |
可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。
语法如下:
array_multisort(
array &$array1,
mixed $array1_sort_order = SORT_ASC,
mixed $array1_sort_flags = SORT_REGULAR,
mixed ...$rest
): bool
参数说明:
换言之,排序是按照字典顺序排列的。
array1_sort_order 和 array1_sort_flags 可以互换位置,也可以全部省略或者省略其中某一个。
返回值:
成功返回true,失败返回false。
代码范例:
$ar1 = [10, 100, 100, 0];
$ar2 = [1, 3, 2, 4];
array_multisort($ar1, $ar2);
print_r($ar1);
print_r($ar2);
// 执行结果如下:
Array
(
[0] => 0
[1] => 10
[2] => 100
[3] => 100
)
Array
(
[0] => 4
[1] => 1
[2] => 2
[3] => 3
)
$arr = [
["10", 11, 100, 100, "a"],
[ 1, 2, "2", 3, 1]
];
array_multisort($arr[0], SORT_ASC, SORT_STRING,
$arr[1], SORT_NUMERIC, SORT_DESC);
var_export($arr);
// 执行结果如下:
array (
0 =>
array (
0 => '10',
1 => 100,
2 => 100,
3 => 11,
4 => 'a',
),
1 =>
array (
0 => 1,
1 => 3,
2 => '2',
3 => 2,
4 => 1,
),
)
$users = [
['name' => '张三', 'age' => '18', 'score' => 20],
['name' => '李四', 'age' => '20', 'score' => 10],
['name' => '王五', 'age' => '19', 'score' => 60],
['name' => '赵六', 'age' => '22', 'score' => 20],
['name' => '徐俊杰', 'age' => '20', 'score' => 60],
['name' => '薛丽', 'age' => '18', 'score' => 70],
];
$ages = array_column($users, 'age');
$scores = array_column($users, 'score');
// 将数据根据 age 降序排列,根据 score 升序排列
// 把 $users 作为最后一个参数,以通用键排序
array_multisort($ages, SORT_DESC, $scores, SORT_ASC, $users);
foreach($users as $item) {
echo "${item['name']}\t{$item['age']}\t{$item['score']}\r\n";
}
// 执行结果如下:
姓名 年龄 成绩
———— ———— ————
赵六 22 20
李四 20 10
徐俊杰 20 60
王五 19 60
张三 18 20
薛丽 18 70
SORT_STRING 和 SORT_REGULAR 都会区分大小写字母,大写字母会排在小写字母之前。
$arr1 = $arr2 = ['Alpha', 'atomic', 'Beta', 'bank'];
// 区分小写排序
array_multisort($arr1);
print_r($arr1);
// 不区分大小写排序
$arr2LowerCase = array_map('strtolower', $arr2);
array_multisort($arr2LowerCase, $arr2);
print_r($arr2);
// 执行结果如下:
Array
(
[0] => Alpha
[1] => Beta
[2] => atomic
[3] => bank
)
Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
)
$arr = [6 => 'c', 'F' => 'd', 'e', 'a'];
array_multisort($arr);
print_r($arr);
// 执行结果如下:
Array
(
[0] => a
[1] => c
[F] => d
[2] => e
)
对数组的值进行升序排序,并保持键与值的关联。
语法如下:
asort(array &array, int $flags = SORT_REGUILAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$arr = ['c', 'd', 'e', 'a'];
asort($arr);
print_r($arr);
// 执行结果如下:
Array
(
[3] => a
[0] => c
[1] => d
[2] => e
)
对数组的值进行降序排序,并保持键与值的关联。
语法如下:
arsort(array &array, int $flags = SORT_REGUILAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$arr = ['c', 'd', 'e', 'a'];
arsort($arr);
print_r($arr);
// 执行结果如下:
Array
(
[2] => e
[1] => d
[0] => c
[3] => a
)
用“自然排序”算法对数组进行不区分大小写字母的排序,并保持键与值的关联。
语法如下:
natcasesort(array &$array): bool
参数说明:
返回值:
总是返回true。
代码范例:
$imgs = [
'IMG0.png',
'img12.png',
'img10.png',
'img2.png',
'img1.png',
'IMG3.png'
];
print_r("排序前:\n");
print_r($imgs);
natcasesort($imgs);
print_r("\n排序后:\n");
print_r($imgs);
// 执行结果如下:
排序前:
Array
(
[0] => IMG0.png
[1] => img12.png
[2] => img10.png
[3] => img2.png
[4] => img1.png
[5] => IMG3.png
)
排序后:
Array
(
[0] => IMG0.png
[4] => img1.png
[3] => img2.png
[5] => IMG3.png
[2] => img10.png
[1] => img12.png
)
用“自然排序”算法对数组进行区分大小写字母的排序,并保持键与值的关联。
语法如下:
natsort(array &$array): bool
参数说明:
返回值:
总是返回true。
代码范例:
$imgs = [
'IMG0.png',
'img12.png',
'img10.png',
'img2.png',
'img1.png',
'IMG3.png'
];
print_r("排序前:\n");
print_r($imgs);
natsort($imgs);
print_r("\n排序后:\n");
print_r($imgs);
// 执行结果如下:
排序前:
Array
(
[0] => IMG0.png
[1] => img12.png
[2] => img10.png
[3] => img2.png
[4] => img1.png
[5] => IMG3.png
)
排序后:
Array
(
[0] => IMG0.png
[5] => IMG3.png
[4] => img1.png
[3] => img2.png
[2] => img10.png
[1] => img12.png
)
对数组的值进行升序排序。排序后会删除原有的键名,并给排序后的元素赋予新的键名。
语法如下:
sort(array &$array, int $flag = SORT_REGULAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$fruits = [
"Orange1",
"orange2",
"Orange3",
"orange20"
];
print_r("排序前:\n");
print_r($fruits);
sort($fruits);
print_r("\n排序后:\n");
print_r($fruits);
// 执行结果如下:
排序前:
Array
(
[0] => Orange1
[1] => orange2
[2] => Orange3
[3] => orange20
)
排序后:
Array
(
[0] => Orange1
[1] => Orange3
[2] => orange2
[3] => orange20
)
$fruits = [
"Orange1",
"orange2",
"Orange3",
"orange20"
];
print_r("排序前:\n");
print_r($fruits);
sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
print_r("\n排序后:\n");
print_r($fruits);
// 执行结果如下:
排序前:
Array
(
[0] => Orange1
[1] => orange2
[2] => Orange3
[3] => orange20
)
排序后:
Array
(
[0] => Orange1
[1] => orange2
[2] => Orange3
[3] => orange20
)
对数组的值进行降序排序。排序后会删除原有的键名,并给排序后的元素赋予新的键名。
语法如下:
rsort(array &$array, int $flag = SORT_REGULAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$fruits = [
"Orange1",
"orange2",
"Orange3",
"orange20"
];
print_r("排序前:\n");
print_r($fruits);
rsort($fruits);
print_r("\n排序后:\n");
print_r($fruits);
// 执行结果如下:
排序前:
Array
(
[0] => Orange1
[1] => orange2
[2] => Orange3
[3] => orange20
)
排序后:
Array
(
[0] => orange20
[1] => orange2
[2] => Orange3
[3] => Orange1
)
$fruits = [
"Orange1",
"orange2",
"Orange3",
"orange20"
];
print_r("排序前:\n");
print_r($fruits);
rsort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
print_r("\n排序后:\n");
print_r($fruits);
// 执行结果如下:
排序前:
Array
(
[0] => Orange1
[1] => orange2
[2] => Orange3
[3] => orange20
)
排序后:
Array
(
[0] => orange20
[1] => Orange3
[2] => orange2
[3] => Orange1
)
请移步到【打乱数组(随机排序)】章节查看。
对数组的键进行升序排序,并保持键与值的关联。
语法如下:
ksort(array &array, int $flags = SORT_REGUILAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$colors = [
'c' => 'cyan',
'a' => 'red',
'd' => 'yellow',
'b' => 'blue'
];
print_r("排序前:\n");
print_r($colors);
ksort($colors);
print_r("\n排序后:\n");
print_r($colors);
// 执行结果如下:
排序前:
Array
(
[c] => cyan
[a] => red
[d] => yellow
[b] => blue
)
排序后:
Array
(
[a] => red
[b] => blue
[c] => cyan
[d] => yellow
)
$ranks = [
0 => 'First',
2 => 'Third',
1 => 'Second'
];
print_r("排序前:\n");
print_r($ranks);
ksort($ranks);
print_r("\n排序后:\n");
print_r($ranks);
// 执行结果如下:
排序前:
Array
(
[0] => First
[2] => Third
[1] => Second
)
排序后:
Array
(
[0] => First
[1] => Second
[2] => Third
)
对数组的键进行降序排序,并保持键与值的关联。
语法如下:
krsort(array &array, int $flags = SORT_REGUILAR): bool
参数说明:
返回值:
总是返回true。
代码范例:
$colors = [
'c' => 'cyan',
'r' => 'red',
'y' => 'yellow',
'b' => 'blue'
];
print_r("排序前:\n");
print_r($colors);
krsort($colors);
print_r("\n排序后:\n");
print_r($colors);
// 执行结果如下:
排序前:
Array
(
[c] => cyan
[r] => red
[y] => yellow
[b] => blue
)
排序后:
Array
(
[y] => yellow
[r] => red
[c] => cyan
[b] => blue
)
$ranks = [
7 => 'First',
20 => 'Third',
15 => 'Second'
];
print_r("排序前:\n");
print_r($ranks);
krsort($ranks);
print_r("\n排序后:\n");
print_r($ranks);
// 执行结果如下:
排序前:
排序前:
Array
(
[7] => First
[20] => Third
[15] => Second
)
排序后:
Array
(
[20] => Third
[15] => Second
[7] => First
)
请移步到【自定义比较函数】章节查看。
使用自定义的比较函数对数组的值进行排序,保持索引和值的对应关系。该函数会改变数组本身的排序,并不会生成新数组。
uasort(array &$array, callback $callback): bool
参数:
callback(mixed $a, mixed $b): int
),比较规则:
升序:$a < $b ? -1 : 1
降序:$a < $b ? 1 : -1
返回值:
总是返回 true。
代码范例:
$array = [
'a' => 4,
'b' => 8,
'c' => -1,
'd' => -9,
'e' => 2
];
print_r("排序前:\n");
print_r($array);
uasort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r("\n排序后:\n");
print_r($array);
// 执行结果如下:
排序前:
Array
(
[a] => 4
[b] => 8
[c] => -1
[d] => -9
[e] => 2
)
排序后:
Array
(
[d] => -9
[c] => -1
[e] => 2
[a] => 4
[b] => 8
)
使用自定义的比较函数对数组的键名进行排序,保持索引和值的对应关系。该函数会改变数组本身的排序,并不会生成新数组。
uksort(array &$array, callback $callback): bool
参数说明:
callback(mixed $a, mixed $b): int
),比较规则:
升序:$a < $b ? -1 : 1
降序:$a < $b ? 1 : -1
返回值:
总是返回 true。
代码范例:
$array = [
'f' => 4,
'b' => 8,
'e' => -1,
'a' => -9,
'c' => 2
];
print_r("排序前:\n");
print_r($array);
uksort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r("\n排序后:\n");
print_r($array);
// 执行结果如下:
排序前:
Array
(
[f] => 4
[b] => 8
[e] => -1
[a] => -9
[c] => 2
)
排序后:
Array
(
[a] => -9
[b] => 8
[c] => 2
[e] => -1
[f] => 4
)
使用自定义的比较函数对数组的值进行排序,排序后会删除原有的键名,并给排序后的元素赋予新的键名。
usort(array &$array, callback $callback): bool
参数说明:
callback(mixed $a, mixed $b): int
),比较规则:
升序:$a < $b ? -1 : 1
降序:$a < $b ? 1 : -1
返回值:
总是返回 true。
代码范例:
$array = [3, 2, 5, 6, 1];
print_r("排序前:\n");
var_export($array);
usort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r("\n排序后:\n");
var_export($array);
// 执行结果如下:
排序前:
array (
0 => 3,
1 => 2,
2 => 5,
3 => 6,
4 => 1,
)
排序后:
array (
0 => 1,
1 => 2,
2 => 3,
3 => 5,
4 => 6,
)
$array = [
['name' => '张三', 'score' => 88],
['name' => '李四', 'score' => 84],
['name' => '王五', 'score' => 68],
['name' => '赵六', 'score' => 98],
['name' => '郑奇', 'score' => 95],
];
print_r("排序前:\n");
foreach($array as $item) {
print_r("{$item['name']}\t{$item['score']}\n");
}
usort($array, function ($a, $b) {
return $a['score'] == $b['score'] ? 0 : ($a['score'] < $b['score'] ? 1 : -1);
});
print_r("\n排序后:\n");
foreach($array as $item) {
print_r("{$item['name']}\t{$item['score']}\n");
}
// 执行结果如下:
排序前:
张三 88
李四 84
王五 68
赵六 98
郑奇 95
排序后:
赵六 98
郑奇 95
张三 88
李四 84
王五 68
打乱数组排序,随机排列单元的顺序。排序后会删除原有的键名,并给排序后的元素赋予新的键名。
语法如下:
shuffle(array &$array): bool
参数说明:
返回值:
成功返回true,失败返回false。
代码范例:
$numbers = range(1, 10, 2);
print_r("排序前:\n");
print_r($numbers);
// 第一次打乱
shuffle($numbers);
print_r("\n第一次打乱排序后:\n");
print_r($numbers);
// 第二次打乱
shuffle($numbers);
print_r("\n第二次打乱排序后:\n");
print_r($numbers);
// 执行结果如下:
序前:
Array
(
[0] => 1
[1] => 3
[2] => 5
[3] => 7
[4] => 9
)
第一次打乱排序后:
Array
(
[0] => 9
[1] => 7
[2] => 1
[3] => 5
[4] => 3
)
第二次打乱排序后:
Array
(
[0] => 3
[1] => 9
[2] => 7
[3] => 5
[4] => 1
)