直接用 min() 函数最安全,时间复杂度 o(n),不修改原数组,兼容索引与关联数组;空数组或含不可比较值时需判空,混合类型需预处理统一类型。

直接用 min() 函数最安全
PHP 里排序后取最小值,其实根本没必要先排序——min() 内部不依赖顺序,时间复杂度 O(n),比先调 sort() 再取 $arr[0](O(n log n))快得多,还避免修改原数组。
常见错误是写成:sort($arr); $min = $arr[0];,这在空数组、非数字键、关联数组下容易出错(比如键被重排后 $arr[0] 不存在)。
- 对索引数组:
min($arr)直接返回最小元素值 - 对关联数组:
min($arr)同样有效,它只比较值,不关心键 - 若数组为空或含非可比较值(如
null、对象),min()会触发警告,建议加判空:!empty($arr) ? min($arr) : null
array_values() + sort() 后取 [0] 的适用场景
只有当你**必须保留排序后的完整数组用于后续操作**(比如还要取最大值、中位数、或遍历有序结果),才值得先排序。这时注意键的问题:
-
sort()会重置数字键,$arr[0]才可靠;但asort()保留键,此时不能用[0],得用reset($arr)或current($arr) - 示例:
$arr = ['a' => 5, 'b' => 1, 'c' => 9]; asort($arr); $min = current($arr); // 1
- 如果硬要用
sort(),记得先用array_values()归一化键:$vals = array_values($arr); sort($vals); $min = $vals[0];
处理混合类型或字符串数字时的陷阱
min() 默认按值类型比较:数字和字符串混在一起时,PHP 会隐式转换,可能不符合预期。比如 min([10, '2', '100']) 返回 '100'(字符串比较),而不是 2。
- 确保统一类型:用
array_map('intval', $arr)或array_map('floatval', $arr)预处理 - 或者用
min(...array_map('floatval', $arr))(PHP 5.6+ 支持展开) - 排序函数也有同样问题:
sort($arr, SORT_NUMERIC)比默认排序更可靠
性能敏感场景别碰 usort() 取最小值
有人图灵活写 usort($arr, fn($a, $b) => $a $b); $min = $arr[0];,这完全没必要。自定义比较器开销大,且 usort() 至少 O(n log n),而一次遍历找最小值只需 O(n)。
- 真要自定义逻辑(比如按对象属性取最小),直接写循环:
$min = null; foreach ($arr as $item) { if ($min === null || $item->score score) $min = $item; } -
array_reduce()也可,但可读性差,且无法短路,不推荐
!empty($arr) ? min($arr) : null 就够了;剩下 5% 要排序,也优先考虑是否真需要整个数组有序——很多时候你只是想拿个最小值而已。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











