在PHP开发过程中,关联数组的多级排序是常见需求,比如先按值降序排列,值相同再按键排序。下面介绍两种可靠的实现方式。

方法一:使用usort自定义比较规则
usort函数可以传入自定义的比较函数,我们可以在比较函数中定义多级排序逻辑。首先比较数组元素的value,若value不同则按降序返回结果;若value相同则比较key,按升序返回结果。
需要注意的是,usort操作的是数组的键值对,我们需要将键和值都传递到比较函数中,因此可以先对数组做键和值的映射处理。
<?php
// 原始关联数组
$assocArr = [
'b' => 30,
'a' => 20,
'c' => 30,
'd' => 10
];
// 将键和值组合成元素数组,方便usort处理
$sortArr = [];
foreach ($assocArr as $key => $value) {
$sortArr[] = ['key' => $key, 'value' => $value];
}
// 自定义比较函数
usort($sortArr, function ($a, $b) {
// 先按值降序比较
if ($a['value'] != $b['value']) {
return $b['value'] - $a['value'];
}
// 值相同则按键升序比较
return strcmp($a['key'], $b['key']);
});
// 重新组装成关联数组
$result = [];
foreach ($sortArr as $item) {
$result[$item['key']] = $item['value'];
}
print_r($result);
// 输出:
// Array
// (
// [b] => 30
// [c] => 30
// [a] => 20
// [d] => 10
// )
?>方法二:使用array_multisort实现多级排序
array_multisort可以对多个数组或多维数组的多个列进行排序,我们可以先提取出值和键作为两个排序维度,再调用函数实现多级排序。
这种方法的优势是代码更简洁,不需要手动循环重组数组,适合处理结构明确的关联数组。
<?php
// 原始关联数组
$assocArr = [
'b' => 30,
'a' => 20,
'c' => 30,
'd' => 10
];
// 提取值作为第一个排序维度,降序排列
$values = array_values($assocArr);
// 提取键作为第二个排序维度,升序排列
$keys = array_keys($assocArr);
// 先按值降序,再按键升序排序
array_multisort($values, SORT_DESC, $keys, SORT_ASC, $assocArr);
print_r($assocArr);
// 输出:
// Array
// (
// [b] => 30
// [c] => 30
// [a] => 20
// [d] => 10
// )
?>两种方法对比
| 方法 | 优势 | 适用场景 |
|---|---|---|
| usort自定义比较 | 逻辑灵活,可支持更复杂的多条件排序规则 | 排序条件复杂、需要自定义比较逻辑的场景 |
| array_multisort | 代码简洁,执行效率更高 | 排序维度明确、条件简单的场景 |
实际开发中可以根据排序规则的复杂度和代码可读性要求选择合适的方法,两种方法都能稳定实现先按值降序再按键排序的需求。