
本文详解如何使用 PHP 的 usort() 函数对含嵌套结构的多维数组(如按 'name' 主键、再按 'account'[0]['id'] 子键)实现稳定、可扩展的多级排序。
本文详解如何使用 php 的 `usort()` 函数对含嵌套结构的多维数组(如按 `'name'` 主键、再按 `'account'[0]['id']` 子键)实现稳定、可扩展的多级排序。
在实际开发中,常需对结构复杂的多维数组进行多条件排序——例如先按用户姓名升序排列,姓名相同时再按其账户 ID 升序排列。PHP 原生的 array_multisort() 虽支持多字段排序,但难以直接处理深层嵌套键(如 $data[0]['account'][0]['id']),而 usort() 结合自定义比较函数则提供了灵活、可控的解决方案。
以下是对原始数据的完整排序实现:
usort($data, function($a, $b) {
// 第一级:按 'name' 字符串升序
$nameCmp = strcmp($a['name'], $b['name']);
if ($nameCmp !== 0) {
return $nameCmp;
}
// 第二级:按 'account'[0]['id'] 数值升序(注意空数组/缺失键防护)
$aId = $a['account'][0]['id'] ?? PHP_INT_MIN;
$bId = $b['account'][0]['id'] ?? PHP_INT_MIN;
return $aId $bId; // 使用太空船操作符,简洁安全
});
✅ 关键优势说明:
- strcmp() 确保字符串比较准确(避免 > 直接比较引发的类型隐式转换问题);
- 使用空合并运算符 ?? 防御性处理可能缺失的 'account' 或 'id' 键,避免 Notice 错误;
- (太空船操作符)天然支持数值/字符串比较,返回 -1/0/1,语义清晰且性能优于手动分支判断。
⚠️ 注意事项:
- 若 'account' 可能为空数组(如 'account' => []),需进一步校验:!empty($a['account']) && isset($a['account'][0]['id']);
- 如需降序,只需交换 $a 和 $b 的位置,或对结果取反(如 return -($aId $bId));
- 多级排序可无限延伸:在前两级相等后,继续添加 if ($nameCmp === 0 && $idCmp === 0) { return $a['status'] $b['status']; } 即可。
最终输出将严格遵循预期顺序:
Adam (id: 2) → Adam (id: 3) → Brian (id: 1) → Chris (id: 4) → David (id: 5) → Esther (id: 6),兼顾可读性与健壮性。











