目录

PHP 数组排序

在 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] =>
        )
)

未完待续。。。