PHP 数组排序(二)
                           
天天向上
发布: 2025-03-19 00:06:34

原创
771 人浏览过

在 PHP 中,除了常见的排序方法外,还可以使用一些更复杂的排序技巧,尤其是当我们处理多维数组、关联数组或者需要自定义排序规则时。以下是一些更复杂的排序方法,涉及到自定义比较函数、排序多维数组、按多个条件排序等。

1. 按多维数组的某一列排序

有时候我们需要根据多维数组中的某个字段(例如数组中的某一列)进行排序。可以使用 usort() 配合自定义比较函数来实现。

示例:

假设我们有一个学生数组,每个学生包含姓名和成绩,按成绩进行排序:

$students = [
    ["name" => "Alice", "score" => 85],
    ["name" => "Bob", "score" => 92],
    ["name" => "Charlie", "score" => 88],
    ["name" => "David", "score" => 90],
];

usort($students, function($a, $b) {
    return $a['score'] <=> $b['score'];  // 使用 PHP 7 的比较运算符
});

print_r($students);

输出:

Array
(
    [0] => Array ( [name] => Alice [score] => 85 )
    [1] => Array ( [name] => Charlie [score] => 88 )
    [2] => Array ( [name] => David [score] => 90 )
    [3] => Array ( [name] => Bob [score] => 92 )
)

2. 按多个字段排序

有时候我们需要按多个条件进行排序。例如,首先按成绩排序,如果成绩相同,则按姓名排序。我们可以通过使用 usort() 结合多个条件来实现。

示例:

$students = [
    ["name" => "Alice", "score" => 85],
    ["name" => "Bob", "score" => 92],
    ["name" => "Charlie", "score" => 92],
    ["name" => "David", "score" => 90],
];

usort($students, function($a, $b) {
    // 首先按成绩排序
    if ($a['score'] === $b['score']) {
        // 如果成绩相同,则按姓名排序
        return strcmp($a['name'], $b['name']);
    }
    return $a['score'] <=> $b['score'];
});

print_r($students);

输出:

Array
(
    [0] => Array ( [name] => Alice [score] => 85 )
    [1] => Array ( [name] => David [score] => 90 )
    [2] => Array ( [name] => Bob [score] => 92 )
    [3] => Array ( [name] => Charlie [score] => 92 )
)

3. 自定义排序规则(uasort()uksort()

如果你想根据数组的值进行排序,并且保持键的关联,可以使用 uasort()uksort() 用于自定义键的排序规则。

示例:使用 uasort() 按值排序并保持键关联

$grades = [
    "John" => 85,
    "Jane" => 92,
    "David" => 88,
    "Alice" => 90,
];

uasort($grades, function($a, $b) {
    return $a <=> $b;  // 按值升序排序
});

print_r($grades);

输出:

Array
(
    [John] => 85
    [David] => 88
    [Alice] => 90
    [Jane] => 92
)

示例:使用 uksort() 按键的自定义规则排序

$array = [
    "apple" => 5,
    "banana" => 2,
    "orange" => 4,
    "grape" => 3,
];

uksort($array, function($a, $b) {
    return strlen($a) <=> strlen($b);  // 按键的长度排序
});

print_r($array);

输出:

Array
(
    [apple] => 5
    [grape] => 3
    [orange] => 4
    [banana] => 2
)

4. 自然顺序排序(natsort() 和 natcasesort())

natsort()natcasesort() 用于按自然顺序对数组进行排序。它们主要用来对带有数字和字母的混合数据进行排序,遵循数字的大小顺序,而不仅仅是按字母顺序。

示例:使用 natsort() 进行自然顺序排序

$items = ["item10", "item2", "item1", "item20", "item11"];
natsort($items);
print_r($items);

输出:

Array
(
    [2] => item1
    [1] => item2
    [0] => item10
    [4] => item11
    [3] => item20
)

5. 逆向排序(使用 array_multisort()

array_multisort() 可以一次对多个数组进行排序。它特别适用于多列数据排序,类似于数据库中的 ORDER BY 子句。

示例:使用 array_multisort() 对多列排序

$names = ["Alice", "Bob", "Charlie"];
$scores = [85, 92, 88];

// 先按分数排序,再按名字排序
array_multisort($scores, SORT_DESC, $names, SORT_ASC);

print_r($names);
print_r($scores);

输出:

Array
(
    [0] => Bob
    [1] => Charlie
    [2] => Alice
)
Array
(
    [0] => 92
    [1] => 88
    [2] => 85
)

6. 自定义排序函数的复杂例子

如果排序需求更复杂,你可以传递一个更复杂的比较函数,或者处理更复杂的数据结构。

示例:按两个条件排序

$data = [
    ['name' => 'John', 'age' => 30, 'score' => 85],
    ['name' => 'Jane', 'age' => 25, 'score' => 92],
    ['name' => 'Alice', 'age' => 30, 'score' => 88],
    ['name' => 'Bob', 'age' => 25, 'score' => 90],
];

usort($data, function($a, $b) {
    // 首先按年龄排序
    if ($a['age'] === $b['age']) {
        // 如果年龄相同,按成绩排序
        return $a['score'] <=> $b['score'];
    }
    return $a['age'] <=> $b['age'];
});

print_r($data);

输出:

Array
(
    [0] => Array ( [name] => Bob [age] => 25 [score] => 90 )
    [1] => Array ( [name] => Jane [age] => 25 [score] => 92 )
    [2] => Array ( [name] => Alice [age] => 30 [score] => 88 )
    [3] => Array ( [name] => John [age] => 30 [score] => 85 )
)

总结

PHP 提供了丰富的排序函数,可以满足大多数常见的排序需求。你可以根据数据的结构和排序规则选择合适的排序函数。对于复杂的排序需求,使用 usort() 配合自定义比较函数是最常用的方法。

参考链接:

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *