在PHP中对多维数组进行排序可以使用多种方法,以下是最常见的几种解决方案:
方法1:使用 usort()
自定义比较函数(按键值排序)
适用于根据数组中某个特定键的值进行排序,支持复杂逻辑。
// 示例数据
$users = [
['name' => 'Alice', 'age' => 25],
['name' => 'Bob', 'age' => 30],
['name' => 'Charlie', 'age' => 20]
];
// 按 'age' 升序排序
usort($users, function ($a, $b) {
return $a['age'] <=> $b['age']; // PHP 7+ 太空船操作符简化比较
});
// 降序排序示例
usort($users, function ($a, $b) {
return $b['age'] <=> $a['age'];
});
方法2:使用 array_multisort()
(多键排序或简单排序)
适用于需要根据多个键排序或直接提取列排序的情况。
// 示例数据
$users = [
['name' => 'Alice', 'age' => 25, 'city' => 'New York'],
['name' => 'Bob', 'age' => 30, 'city' => 'London'],
['name' => 'Charlie', 'age' => 20, 'city' => 'Paris']
];
// 提取排序依据的列
$ages = array_column($users, 'age');
$cities = array_column($users, 'city');
// 先按城市升序,再按年龄降序排序
array_multisort(
$cities, SORT_ASC, // 第一排序键
$ages, SORT_DESC, // 第二排序键
$users // 待排序的主数组
);
方法3:使用 uasort()
保留键关联
如果数组是关联数组(如键名为ID),需要保留键名时使用:
$users = [
'u1' => ['name' => 'Alice', 'age' => 25],
'u2' => ['name' => 'Bob', 'age' => 30],
'u3' => ['name' => 'Charlie', 'age' => 20]
];
uasort($users, function ($a, $b) {
return $a['age'] <=> $b['age'];
});
多字段排序示例
若需先按城市排序,城市相同再按年龄排序:
usort($users, function ($a, $b) {
// 先比较城市
$cityCompare = strcmp($a['city'], $b['city']);
if ($cityCompare !== 0) {
return $cityCompare;
}
// 城市相同则比较年龄
return $a['age'] <=> $b['age'];
});
说明
usort()
:直接修改原数组,不保留键名(适合索引数组)。uasort()
:保留原键名(适合关联数组)。array_multisort()
:适合多键排序,但需预先提取排序键的数组。- PHP版本:确保使用 PHP 5.5+(
array_column
)或更高版本,PHP 7+ 的太空船操作符(<=>
)可简化比较逻辑。
根据具体需求选择合适的方法,如需保留键或处理复杂排序逻辑,可灵活组合上述函数。