php实现排序
PHP 数组排序方法
PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法:
按值升序排序
sort() 函数对数组按值升序排序,重置键名(索引数组适用):
$numbers = [3, 1, 4];
sort($numbers);
print_r($numbers); // 输出: [1, 3, 4]
按值降序排序
rsort() 函数对数组按值降序排序,重置键名:
$numbers = [3, 1, 4];
rsort($numbers);
print_r($numbers); // 输出: [4, 3, 1]
按键升序排序
ksort() 函数对关联数组按键名升序排序,保留键值关联:
$age = ["Peter"=>35, "Ben"=>20];
ksort($age);
print_r($age); // 输出: ["Ben"=>20, "Peter"=>35]
按键降序排序
krsort() 函数对关联数组按键名降序排序:
$age = ["Peter"=>35, "Ben"=>20];
krsort($age);
print_r($age); // 输出: ["Peter"=>35, "Ben"=>20]
保持键值关联的按值排序
asort() 函数对关联数组按值升序排序,保留键值关联:
$age = ["Peter"=>35, "Ben"=>20];
asort($age);
print_r($age); // 输出: ["Ben"=>20, "Peter"=>35]
保持键值关联的按值降序排序
arsort() 函数对关联数组按值降序排序:
$age = ["Peter"=>35, "Ben"=>20];
arsort($age);
print_r($age); // 输出: ["Peter"=>35, "Ben"=>20]
自定义排序
使用 usort() 自定义比较逻辑
通过回调函数定义排序规则(适用于复杂排序需求):
function cmp($a, $b) {
if ($a == $b) return 0;
return ($a < $b) ? -1 : 1;
}
$numbers = [3, 1, 4];
usort($numbers, "cmp");
print_r($numbers); // 输出: [1, 3, 4]
多条件排序示例 结合多个字段进行排序(如先按年龄升序,再按姓名降序):
$users = [
['name' => 'Alice', 'age' => 28],
['name' => 'Bob', 'age' => 22],
['name' => 'Charlie', 'age' => 28]
];
usort($users, function($a, $b) {
if ($a['age'] == $b['age']) {
return strcmp($b['name'], $a['name']);
}
return $a['age'] - $b['age'];
});
print_r($users);
自然排序
natsort() 自然顺序排序
处理包含数字的字符串时按人类直觉排序(如 "img2" 排在 "img10" 前):
$files = ["img12", "img10", "img2"];
natsort($files);
print_r($files); // 输出: ["img2", "img10", "img12"]
多维数组排序
使用 array_multisort()
对多维数组按某一列排序:
$data = [
['name' => 'Tom', 'score' => 80],
['name' => 'Ann', 'score' => 95],
['name' => 'Sam', 'score' => 75]
];
$scores = array_column($data, 'score');
array_multisort($scores, SORT_DESC, $data);
print_r($data);
注意事项
- 排序函数直接修改原数组,而非返回新数组
- 关联数组排序时注意选择是否保留键值关联(
asort/ksort系列) - 对大型数据集建议使用
usort而非sort,后者可能更高效







