array_splice 用于删除或插入索引数组元素,从指定偏移位置切掉指定长度子数组并重排数字键;删除需设正确 offset 和 length,插入必须设 length 为 0 并传入新元素数组。

用 array_splice 删除索引数组的元素,关键看偏移和长度
array_splice 不是“删指定值”,而是“从某个位置切掉一段”。它会直接修改原数组,返回被删掉的子数组。
常见错误是传错 $offset(起始下标)或 $length(删几个):
- 删第 2 个元素(下标为 1):
array_splice($arr, 1, 1) - 删最后两个:
array_splice($arr, -2)($length省略 = 删到末尾) - 删从下标 3 开始的所有:
array_splice($arr, 3) - ⚠️ 错误写法:
array_splice($arr, 1, 0)—— 这不删任何元素,但会重排键名(见下条)
用 array_splice 在中间插入元素,必须设 $length 为 0
插入的本质是“删 0 个,再补上新元素”。如果不设 $length = 0,默认会删掉后续元素,不是插入而是替换。
示例:在下标 2 后插入 ['x', 'y']:
立即学习“PHP免费学习笔记(深入)”;
array_splice($arr, 2, 0, ['x', 'y']);
注意点:
- 插入位置是“在指定下标之前”:
array_splice($arr, 0, 0, $new)插到开头;array_splice($arr, count($arr), 0, $new)插到末尾 - 插入的值可以是单个值,也可以是数组 —— 不会自动展开,所以要传
['a','b']而不是'a','b' - 插入后原数组索引会连续重排(因为是索引数组),不会保留空洞
为什么 array_splice 改变原数组,而 array_slice 不会
array_splice 是“破坏性操作”,设计目标就是修改原结构;array_slice 是只读取副本。这点容易混淆,尤其刚从 JavaScript 转来的人习惯函数式思维。
如果你需要不改原数组,又想模拟 splice 行为,得手动组合:
$new = array_merge(
array_slice($arr, 0, $offset),
$replacement,
array_slice($arr, $offset + $length)
);
但多数场景下,直接用 array_splice 更轻量、更符合 PHP 数组的惯用逻辑。
删除/插入后键名是否保留?只对索引数组有效
array_splice 对纯数字索引数组会重置键名(变成 0,1,2…),这是它和 unset() 的核心区别:
-
unset($arr[1])→ 键名保留,变成[0=>'a', 2=>'c'] -
array_splice($arr, 1, 1)→ 键名重排,变成[0=>'a', 1=>'c']
所以如果你依赖连续整数键(比如 for 循环、array_values() 前处理),array_splice 是更干净的选择;如果需要保留原始键位关系(比如关联 ID 映射),就得换 unset + array_values 组合。
真正容易被忽略的是:这个重排行为只发生在索引数组上;如果数组混有字符串键,array_splice 仍会重排数字键部分,但字符串键不受影响 —— 实际中建议避免混用,否则行为难预测。



















