在 PHP 中有很多针对数组的排序函数,非常方便。这些函数对一维数组进行关键字排序、按值排序、逆排序等。但对于多维数组的按需排序需要自己编写特定的函数去现实。
函数名称 | 数组索引键保持 | 顺序 | 相关函数 |
---|
array_multisort() | 键值关联的保持,数字类型的不保持 | 第一个数组或者由选项指定 | array_walk() |
asort() | 是 | 由低到高 | arsort() |
arsort() | 是 | 由高到低 | asort() |
natcasesort() | 是 | 自然排序,大小写不敏感 | natsort() |
natsort() | 是 | 自然排序 | natcasesort() |
rsort() | 否 | 由高到低 | sort() |
sort() | 否 | 由低到高 | rsort() |
shuffle() | 否 | 随机 | array_rand() |
uasort() | 是 | 由用户定义 | uksort() |
usort() | 否 | 由用户定义 | uasort() |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <?php
$array = [
'c' => ['id' => 4000, 'name' => 'Jack'],
'e' => ['id' => 2000, 'name' => 'Dane'],
'd' => ['id' => 1000, 'name' => 'Mark'],
'a' => ['id' => 5000, 'name' => 'Alan'],
'b' => ['id' => 3000, 'name' => 'Toby'],
];
function sort_by_id($left, $right)
{
return $left['id'] <=> $right['id'];
}
function sort_by_name($left, $right)
{
return strcasecmp($left['name'], $right['name']);
}
|
使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| <?php
uasort($array, 'sort_by_id');
print_r($array);
// 结果
Array
(
[d] => Array
(
[id] => 1000
[name] => Mark
)
[e] => Array
(
[id] => 2000
[name] => Dane
)
[b] => Array
(
[id] => 3000
[name] => Toby
)
[c] => Array
(
[id] => 4000
[name] => Jack
)
[a] => Array
(
[id] => 5000
[name] => Alan
)
)
|
strcasecmp()
- 二进制安全比较字符串(不区分大小写)
strcmp()
- 二进制安全比较字符串(区分大小写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| <?php
uasort($array, 'sort_by_name');
print_r($array);
// 结果
Array
(
[d] => Array
(
[id] => 1000
[name] => Mark
)
[e] => Array
(
[id] => 2000
[name] => Dane
)
[b] => Array
(
[id] => 3000
[name] => Toby
)
[c] => Array
(
[id] => 4000
[name] => Jack
)
[a] => Array
(
[id] => 5000
[name] => Alan
)
)
Array
(
[a] => Array
(
[id] => 5000
[name] => Alan
)
[e] => Array
(
[id] => 2000
[name] => Dane
)
[c] => Array
(
[id] => 4000
[name] => Jack
)
[d] => Array
(
[id] => 1000
[name] => Mark
)
[b] => Array
(
[id] => 3000
[name] => Toby
)
)
|
使用用户自定义的比较函数对数组中的值进行排序,此函数为 array
中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| <?php
usort($array, 'sort_by_id');
print_r($array);
// 结果
Array
(
[0] => Array
(
[id] => 1000
[name] => Mark
)
[1] => Array
(
[id] => 2000
[name] => Dane
)
[2] => Array
(
[id] => 3000
[name] => Toby
)
[3] => Array
(
[id] => 4000
[name] => Jack
)
[4] => Array
(
[id] => 5000
[name] => Alan
)
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| <?php
usort($array, 'sort_by_name');
print_r($array);
// 结果
Array
(
[0] => Array
(
[id] => 5000
[name] => Alan
)
[1] => Array
(
[id] => 2000
[name] => Dane
)
[2] => Array
(
[id] => 4000
[name] => Jack
)
[3] => Array
(
[id] => 1000
[name] => Mark
)
[4] => Array
(
[id] => 3000
[name] => Toby
)
)
|
函数名称 | 数组索引键保持 | 顺序 | 相关函数 |
---|
krsort() | 是 | 由高到低 | ksort() |
ksort() | 是 | 由低到高 | asort() |
uksort() | 是 | 由用户定义 | uasort() |
<?php
$array = [
'b' => ['a' => 1, 'c' => 0.01, 'b' => null],
'a' => ['b' => 3, 'a' => 0.03, 'c' => null],
'c' => ['c' => 2, 'b' => 0.02, 'a' => null],
];
function sort_by_key($left, $right)
{
return strcasecmp($left, $right);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| <?php
uksort($array, 'sort_by_key');
print_r($array);
// 结果
Array
(
[a] => Array
(
[b] => 3
[a] => 0.03
[c] =>
)
[b] => Array
(
[a] => 1
[c] => 0.01
[b] =>
)
[c] => Array
(
[c] => 2
[b] => 0.02
[a] =>
)
)
|
未完待续。。。