array_slice()是最直接的取索引数组前几项方法,默认重置为连续数字键;需注意$preserve_keys参数、原数组不可变性及超大数组的性能优化。

用 array_slice() 最直接,但要注意索引保留问题
PHP 里取索引数组前几项,array_slice() 是标准解法。它默认保留原键名,对纯数字索引数组来说,结果会变成从 0 开始的连续新索引——这点很多人误以为“不保留”,其实是函数设计如此($preserve_keys = false 是默认值)。
常见错误:用 array_splice() 或循环手动 unset(),既冗余又容易破坏原数组。
- 取前 3 项:
array_slice($arr, 0, 3) - 第 2 个参数是起始偏移量(从 0 开始),第 3 个是长度;负数长度会被忽略,不会报错但结果为空数组
- 如果原数组只有 2 项,取前 5 项会安全返回全部 2 项,不用提前
count()判断
需要重置键名?显式调用 array_values() 就行
虽然 array_slice() 默认已重置为数字索引,但如果你在代码中看到键名没变(比如还是 [5] => 'a', [6] => 'b'),那说明你传了 true 给第 4 个参数 $preserve_keys —— 这通常不是你想要的。
真正需要“确保连续数字键”的场景,比如后续要 foreach 配合 $i 下标操作,或者要 json_encode() 成紧凑数组,就加一层 array_values():
$firstThree = array_values(array_slice($arr, 0, 3));
注意:array_values() 本身不改变原数组,只返回新数组,开销很小。
性能敏感时别用 array_slice() 处理超大数组
array_slice() 内部会复制元素,对百万级元素的数组,哪怕只取前 10 项,也会触发整块内存拷贝。这时候更高效的做法是用 Iterator + LimitIterator 流式处理:
$it = new LimitIterator(new ArrayIterator($arr), 0, 10); $result = iterator_to_array($it, false); // false 表示不保留键名
这种写法内存占用恒定,但代码略长;日常几百几千项完全没必要,别过早优化。
别混淆 array_slice() 和 array_splice()
这两个名字太像,但行为完全不同:array_splice() 会修改原数组,并返回被删掉的部分;而 array_slice() 是只读的,原数组毫发无损。
典型翻车现场:写成 array_splice($arr, 0, 3) 后发现原数组只剩后面部分了——这不是取,这是删。
- 只读取?死守
array_slice() - 既要取、又要删原数组?才考虑
array_splice(),但得清楚副作用 - 不确定时,先
var_dump($arr)看一眼执行前后是否一致
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











