用 array_slice() 截取索引数组最直接,需加第四个参数 true 重置键为 0-based;array_splice() 会修改原数组,不可替代;避免冗余调用 array_values();函数对空数组和越界安全。

用 array_slice() 最直接,但要注意索引是否重置
PHP 截取索引数组(即数字键数组)用 array_slice() 是标准做法。它默认保留原键名,但多数场景下你想要的是连续的 0-based 索引——这时候得手动加第四个参数 true。
- 不加
true:返回的子数组仍带原始键(比如从索引 3 开始截,第一个元素键是3) - 加
true:键被重置为0, 1, 2...,这才是通常说的“新索引数组” - 起始位置支持负数(如
-2表示倒数第二个),长度也支持负数(如-1表示去掉最后一个)
示例:
$arr = ['a', 'b', 'c', 'd', 'e'];<br>$part = array_slice($arr, 1, 3, true); // ['b', 'c', 'd'],键为 0,1,2
array_slice() 和 array_splice() 别混用
array_splice() 看起来相似,但它会**修改原数组**,而且返回值是被移除的部分,不是你要的“截取”。除非你真想边截边删,否则别用它来取子数组。
-
array_slice($arr, 2, 3)→ 安全读取,原数组不变 -
array_splice($arr, 2, 3)→ 原数组从索引 2 起删掉 3 个元素,返回那 3 个 - 如果误用
array_splice()还没注意到原数组被改了,后续逻辑可能出错,尤其在循环或函数多次调用时
大数组截取要注意性能,别用 array_values() 多此一举
有人习惯先 array_slice() 再套一层 array_values() 强制重索引,这其实多余,还多一次遍历。直接用 array_slice($arr, $offset, $length, true) 就够了。
-
array_values()会重新扫描整个结果数组,时间复杂度 O(n),对万级元素以上明显拖慢 -
array_slice(..., true)在内部直接重建索引,更轻量 - 如果原数组本身键不连续(比如删过元素),而你又依赖严格递增索引,那就必须用
true参数,不能省
注意 array_slice() 对空数组和越界的安全性
这个函数对边界很友好:起始位置超出范围返回空数组;长度超出只取到末尾;传入空数组也不会报错。不用提前 count() 判断,写起来更干净。
-
array_slice([1,2], 5, 1)→[],不是警告 -
array_slice([1,2], 1, 10)→[2],自动截断 - 但如果你依赖返回数组的长度做后续判断,记得检查结果是否为空,而不是假设一定有数据
真正容易漏的是键重置逻辑——尤其是把截取结果传给依赖 0 开头索引的函数(比如 implode() 没问题,但某些自定义处理函数可能隐式依赖键顺序),这时候不加 true 就会出怪问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











