先说说数组排序函数的主要特点和区别;
排序函数属性比较
可以用来一次对多个数组进行排序;或者根据某一维或多维对多维数组进行排序。
关联;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;]} {$item[;age;]} {$item[;score;]}
;;
}
// 执行结果如下;
姓名 年龄 成绩
———— ———— ————
赵六 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(;排序前;
;);
print_r($imgs);
natcasesort($imgs);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($imgs);
natsort($imgs);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($fruits);
sort($fruits);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($fruits);
sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($fruits);
rsort($fruits);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($fruits);
rsort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($colors);
ksort($colors);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($ranks);
ksort($ranks);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($colors);
krsort($colors);
print_r(;
排序后;
;);
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(;排序前;
;);
print_r($ranks);
krsort($ranks);
print_r(;
排序后;
;);
print_r($ranks);
// 执行结果如下;
排序前;
排序前;
Array
(
[7] => First
[20] => Third
[15] => Second
)
排序后;
Array
(
[20] => Third
[15] => Second
[7] => First
)
请移步到【自定义比较函数】章节查看。
使用自定义的比较函数对数组的值进行排序;保持索引和值的对应关系。该函数会改变数组本身的排序;并不会生成新数组。
uasort(array &$array, callback $callback): bool
参数;
升序;$a < $b ? -1 : 1
降序;$a < $b ? 1 : -1
返回值;
总是返回 true。
代码范例;
$array = [
;a; => 4,
;b; => 8,
;c; => -1,
;d; => -9,
;e; => 2
];
print_r(;排序前;
;);
print_r($array);
uasort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r(;
排序后;
;);
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
参数说明;
升序;$a < $b ? -1 : 1
降序;$a < $b ? 1 : -1
返回值;
总是返回 true。
代码范例;
$array = [
;f; => 4,
;b; => 8,
;e; => -1,
;a; => -9,
;c; => 2
];
print_r(;排序前;
;);
print_r($array);
uksort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r(;
排序后;
;);
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
参数说明;
升序;$a < $b ? -1 : 1
降序;$a < $b ? 1 : -1
返回值;
总是返回 true。
代码范例;
$array = [3, 2, 5, 6, 1];
print_r(;排序前;
;);
var_export($array);
usort($array, function ($a, $b) {
return $a == $b ? 0 : ($a < $b ? -1 : 1);
});
print_r(;
排序后;
;);
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(;排序前;
;);
foreach($array as $item) {
print_r(;{$item[;name;]} {$item[;score;]}
;);
}
usort($array, function ($a, $b) {
return $a[;score;] == $b[;score;] ? 0 : ($a[;score;] < $b[;score;] ? 1 : -1);
});
print_r(;
排序后;
;);
foreach($array as $item) {
print_r(;{$item[;name;]} {$item[;score;]}
;);
}
// 执行结果如下;
排序前;
张三 88
李四 84
王五 68
赵六 98
郑奇 95
排序后;
赵六 98
郑奇 95
张三 88
李四 84
王五 68
打乱数组排序;随机排列单元的顺序。排序后会删除原有的键名;并给排序后的元素赋予新的键名。
语法如下;
shuffle(array &$array): bool
参数说明;
返回值;
成功返回true;失败返回false。
代码范例;
$numbers = range(1, 10, 2);
print_r(;排序前;
;);
print_r($numbers);
// 第一次打乱
shuffle($numbers);
print_r(;
第一次打乱排序后;
;);
print_r($numbers);
// 第二次打乱
shuffle($numbers);
print_r(;
第二次打乱排序后;
;);
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
)