array_splice() 是在索引数组中间插入元素的最直接可靠方法,通过指定偏移量、删除长度为0及插入值实现,原数组被就地修改。

用 array_splice() 在索引数组中间插入元素
PHP 没有内置的「在指定下标插入」函数,array_splice() 是最直接、最可靠的选择。它本质是「切开数组 + 插入 + 拼回」,天然支持在任意位置(包括开头、中间、末尾)插入元素,且不改变原有键值顺序(对纯索引数组而言)。
常见错误是误用 array_merge() 或手动拆分 array_slice() 拼接——写法冗长,还容易因键重排出错。
-
array_splice($arr, $offset, 0, $new_element):第三个参数为0表示不删除任何元素,第四个参数是要插入的值(可为单个值或数组) -
$offset从0开始计数;若为负数,则从末尾倒数(如-1表示倒数第一个位置前) - 插入单个元素时,
$new_element必须是数组,比如['new'];传字符串会报 Warning 并静默失败 - 原数组会被修改(函数是「就地操作」),如需保留原数组,请先
$new_arr = $arr
```php $arr = ['a', 'b', 'c']; array_splice($arr, 1, 0, ['x']); // 在索引 1 前插入 // 结果:['a', 'x', 'b', 'c'] ```
插入多个元素或混合数据类型时要注意什么
当要插的是多个值,或含关联键的数组时,array_splice() 的行为依然稳定,但需注意语义差异:
- 插入多个值:把它们包进一个数组,如
['x', 'y', 'z']—— 这些会按顺序连续插入 - 插入关联数组(如
['k' => 'v']):它仍会以「数值方式」插入(即忽略键名,只取值),结果仍是纯索引数组 - 如果目标数组本身含字符串键,
array_splice()仍按数字偏移操作,不会影响其他键;但插入后整体变成「混合键数组」,后续foreach遍历顺序取决于 PHP 版本和插入位置 - 性能上,
array_splice()时间复杂度是 O(n),因为内部要移动后续元素;频繁在大数组头部插入应考虑是否设计合理
```php $arr = [0 => 'first', 2 => 'third']; // 注意键不连续 array_splice($arr, 1, 0, ['second']); // 结果:[0 => 'first', 1 => 'second', 2 => 'third'] —— 键被重排为连续索引 ```
为什么不用 array_insert() 或自定义函数
PHP 标准库中根本不存在 array_insert() 函数,网上很多所谓「封装」其实只是对 array_splice() 的简单包装,反而增加调用开销和理解成本。
立即学习“PHP免费学习笔记(深入)”;
- 自己写循环 +
array_unshift()/array_push()模拟插入:逻辑易错(尤其处理0位置或负偏移)、性能差、不处理边界(如$offset > count($arr)) - 用
array_merge(array_slice(...), [...], array_slice(...)):代码长、可读性差、对空数组或越界slice处理不健壮 - 某些框架(如 Laravel)提供
Arr::insert(),但底层仍是array_splice(),没必要为简单需求引入依赖
插入后键值是否连续?怎么保持原始键
对纯索引数组(键为 0,1,2,...),array_splice() 插入后会自动重排为连续整数键 —— 这通常是期望行为。但如果原始数组键不规则(如 [5 => 'a', 10 => 'b']),插入操作仍按数字偏移进行,但结果数组键不再连续,且插入部分总是获得新数值键。
- 想严格保持所有原始键不变(包括插入项也用指定键),就不能用索引插入思路,而应改用
array_merge()+array_replace()组合,或手动构造新键数组 - 例如:要在键
7处「插入」一个新键值对7 => 'new',本质是「合并并覆盖」,不是位置插入 - 判断依据很简单:如果你关心的是「第几个位置」,就用
array_splice();如果你关心的是「某个键是否存在/是否覆盖」,那问题本身就不属于「索引插入」范畴
实际项目里,90% 的「指定位置插入」需求都对应真实顺序场景(如日志队列、表单字段排序),用 array_splice() 直接、安全、无歧义。



















