应直接用 max() 获取数组最大值,因其时间复杂度 O(n)、安全可靠;对关联数组需先 array_values();空数组须判空;多维数组需先 array_column();仅业务逻辑特殊时才用 usort()。

直接用 max() 最省事,别先排序再取
PHP 里想拿数组最大值,max() 是专为此设计的函数,时间复杂度 O(n),比先调 sort() 再取最后一个元素(O(n log n))快得多,也更安全。尤其对关联数组、含字符串或混合类型的数据,sort() 可能意外改变键名或触发类型转换,而 max() 会按 PHP 的比较规则原样比对。
常见误操作:写成 sort($arr); $max = end($arr); —— 这不仅慢,还可能返回错误值(比如 end() 指向空或非数值项)。
-
max()支持传入数组,也支持多个参数:max($arr)或max(3, 7, 1) - 若数组为空,
max()报 Warning 并返回FALSE,建议加判空:!empty($arr) ? max($arr) : null - 对多维数组不适用,需先
array_column()提取列,再max()
usort() 后取最大值?只在需要自定义顺序时才这么做
只有当“最大”的定义不是数值大小,而是业务逻辑(比如按时间戳、按权重、按中文拼音首字母),才该先用 usort() 排序,再取首项或末项。但注意:usort() 不保留原始键名,且返回布尔值而非新数组,必须原地修改后访问。
例如按对象属性排序后取“最大”对象:
立即学习“PHP免费学习笔记(深入)”;
usort($users, function($a, $b) {
return $b->score <=> $a->score; // 降序
});
$topUser = $users[0] ?? null;
- 用
<=>船锚操作符避免浮点误差和类型强制转换问题 - 排序后务必检查数组是否为空,否则
$users[0]会 Notice - 如果只是要最大值对应的那个对象,其实可用
array_reduce()一次遍历完成,无需排序
关联数组里用 max(array_values()) 防键名干扰
关联数组(如 ['a' => 5, 'b' => 9, 'c' => 2])不能直接用 max() 确保行为一致——虽然通常可行,但 PHP 文档明确说 max() 对关联数组“结果未定义”。稳妥做法是先提取值再求最大:
- 用
max(array_values($assocArr)),确保只比数值,忽略键名 - 若还需知道哪个键对应最大值,改用
array_keys($assocArr, max(array_values($assocArr)))(返回所有匹配键的数组) - 注意
array_values()会重排索引,如果原始键有意义且需保留,应避免全量提取,改用循环或foreach+ 记录
性能敏感场景下,避免重复计算
如果代码中多次需要最大值(比如在循环里判断、或与其它统计值联动),别每次调 max() —— 它每次都遍历整个数组。应提前算好并缓存:
- 简单情况:赋值给变量,复用
$maxVal = max($data); - 数据动态变化时,考虑封装为类属性,配合 setter 更新缓存
- 超大数据集(如数万元素),
max()仍比排序快,但若同时还要最小值、中位数等,可考虑单次遍历手动收集多个极值,减少重复扫描
真正需要“排序后取最大值”的场景极少;多数时候那是思维惯性带来的冗余操作。记住:排序是重动作,取极值是轻动作,别用重动作解决轻问题。



















