最直接方式是先排序再用array_slice取前10条:先调用sort()、rsort()或usort()排序,再执行array_slice($arr, 0, 10)安全截取,不修改原数组且兼容各种场景。

PHP数组排序后用array_slice取前10条最直接
PHP里排序和截取是两个独立动作,不能指望sort()或usort()返回切片结果。必须先排序、再用array_slice()拿前10条——这是最可控、最不容易出错的方式。
常见错误是试图在foreach里手动计数 break,或者误以为array_splice()能不修改原数组就取前N项(它默认会修改原数组)。
-
array_slice($arr, 0, 10)安全、不改原数组,推荐首选 - 如果原数组很大,又只想要前10个,别用
rsort()再array_slice()取后10——那是取“最大10个”,不是“排序后前10个” - 升序/降序取决于你用
sort()还是rsort(),array_slice()本身不关心顺序,只按索引取
关联数组按字段排序后取前10,用usort() + array_slice()
比如要按price升序取最便宜的10个商品,不能用sort()(它会丢键名、乱数据结构),得用usort()配合匿名函数。
注意:PHP 7.4+ 可用箭头函数简化,但低于此版本需完整function ($a, $b) { return $a['price'] $b['price']; }写法。
- 排序前确认字段存在,否则
usort()可能触发Notice: Undefined index - 若字段是字符串数字(如
'123'),用intval()或(int)转一下再比较,避免字典序错乱 - 取完记得
array_values()重置键名(如果后续要json_encode或遍历索引),否则键可能是乱的
大数据量时别在PHP里全量排序,考虑数据库LIMIT 10
如果原始数据来自MySQL,且表有上万行,硬在PHP里usort()再array_slice(),性能和内存都会吃紧。这时候应该把排序和截断交给数据库。
例如:SELECT * FROM products ORDER BY price ASC LIMIT 10,比查出全部再PHP处理快一个数量级。
- 只有当数据已加载进PHP(比如缓存里的数组、API返回结果),才适合用
array_slice() - 如果必须PHP端处理,且数组超5000元素,建议加
memory_get_usage()监控,避免OOM - 注意MySQL的
LIMIT不保证全局唯一性(比如price相同),如需稳定结果,应加上二级排序字段,如ORDER BY price, id
array_slice的第三个参数为null或省略时行为不同
这点容易被忽略:array_slice($arr, 0, 10)取10个;但array_slice($arr, 0)(只传两个参数)会取从0开始到末尾所有元素——不是取10个。
更隐蔽的坑是:传10.5、'10'这种非整型,PHP会自动转整型,但null会被当成0,导致取空数组。
- 始终显式写
array_slice($arr, 0, 10),不要省略第三个参数 - 如果10是变量,先
$n = (int)$n; $n = max(0, min($n, 1000));做安全截断,防注入或异常值 - 空数组或元素不足10个时,
array_slice不会报错,返回实际存在的元素——这是优点,但也意味着你要自己判断是否真拿到了10条
实际项目里,90%的情况只需要usort() + array_slice()两步;剩下10%,该让数据库干的活别硬塞给PHP。键名保留、类型安全、边界控制——这三处漏掉任何一个,都可能在上线后某个凌晨三点弹出告警。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











