array_splice() 是在指定索引处插入子数组的最直接方案:array_splice($arr, $offset, 0, $subArray) 在 $offset 位置插入 $subArray,不删除元素,数值键重排、关联键保留。

用 array_splice() 在索引位置插入子数组
PHP 没有原生的「在第 N 位插入一个数组」函数,但 array_splice() 是最直接、最可控的方案。它能精准切开原数组,在指定索引处插入新元素(包括子数组),且不改变后续键名顺序(数值键会重排,关联键保留)。
常见错误是误用 array_merge() 或 + 运算符——它们只能拼接在末尾或按键覆盖,无法实现「中间插入」。
-
array_splice($arr, $offset, 0, $subArray):第三个参数为0表示不删除任何元素,第四个参数是要插入的子数组 - 索引从
0开始;若$offset超出范围(如大于数组长度),会自动追加到末尾 - 注意:该操作直接修改原数组,如需保留原数组,请先
$newArr = $arr赋值副本
```php
$users = [['id'=>1,'name'=>'Alice'], ['id'=>3,'name'=>'Charlie']];
$sub = [['id'=>2,'name'=>'Bob']];
<p>array_splice($users, 1, 0, $sub); // 在索引 1 处插入
// 结果:[ ['id'=>1,'name'=>'Alice'], ['id'=>2,'name'=>'Bob'], ['id'=>3,'name'=>'Charlie'] ]</p><pre class='brush:</pre>;toolbar:false;'>
<H3>往关联数组的「某个键之后」插入子数组?没有内置方法</H3>
<p>PHP 关联数组本身无序(尽管遍历时保持插入顺序),所以「在键 <code>'foo'</code> 后插入」不是语言层面的概念,而是业务逻辑需求。你需要先定位目标键的索引位置,再用 <code>array_splice()</code>。</p>
<p>关键点在于:必须把关联数组转为数值索引数组才能定位位置。</p>
<ul>
<li>用 <code>array_keys($arr)</code> 获取所有键,<code>array_search('target_key', array_keys($arr))</code> 找到目标键的数值下标</li>
<li>插入位置通常是该下标 + 1(即「之后」),但要检查是否越界</li>
<li>插入后,新元素会获得新的数值索引,原关联键不受影响</li>
</ul>
<pre>```php
$data = ['header' => 'top', 'body' => 'content', 'footer' => 'bottom'];
$keys = array_keys($data);
$pos = array_search('body', $keys);
if ($pos !== false) {
$toInsert = ['ad' => 'banner'];
array_splice($data, $pos + 1, 0, $toInsert);
}
// 结果:['header'=>'top', 'body'=>'content', 'ad'=>'banner', 'footer'=>'bottom']
```</pre>
<H3>用 <code>array_merge()</code> 拼接时为什么子数组总被展开?</H3>
<p>因为 <code>array_merge()</code> 的设计就是扁平化合并:它把每个参数当作「待合并的顶层数组」,而不是「一个要整体插入的元素」。如果你传入一个子数组,它会把子数组里的每个键值对拆出来,和原数组逐个合并。</p>
<p>这是最容易踩的坑——你以为 <code>array_merge($a, [$b])</code> 是插入一个子数组,实际效果等价于 <code>array_merge($a, $b)</code>(如果 <code>$b</code> 是一维关联数组)。</p>
<ul>
<li>想插入「整个数组作为一个元素」,必须用 <code>array_splice()</code> 或手动切分 + 合并</li>
<li>手动方式示例:<code>array_merge(array_slice($arr, 0, $n), [$subArray], array_slice($arr, $n))</code>,但注意这会让 <code>$subArray</code> 成为一个独立元素(即嵌套一层),而 <code>array_splice()</code> 是展开插入</li>
<li>性能上,<code>array_splice()</code> 原地操作更轻量;手动 <code>array_slice</code> + <code>array_merge</code> 会创建多个临时数组</li>
</ul>
<H3>多维数组嵌套插入时要注意键冲突</H3>
<p>当你用 <code>array_splice()</code> 往一个数值索引数组中插入子数组,子数组如果是关联结构(如 <code>['name'=>'X', 'age'=>25]</code>),它会被当作一个普通元素插入,不会引发键冲突。但如果子数组本身含数字键,且你期望它融入父数组的数值序列,就得小心了。</p>
<ul>
<li><code>array_splice()</code> 插入的是「值」,不是「键值对映射」;子数组的内部键完全保留,不会和父数组的数字键合并</li>
<li>例如插入 <code>[0=>'first', 1=>'second']</code> 到索引 <code>1</code>,结果中它就是一个独立元素,其内部 <code>0</code> 和 <code>1</code> 不会影响外层数组的索引编号</li>
<li>只有当你用 <code>+</code> 或 <code>array_merge()</code> 合并两个数值数组时,才可能因键重复导致覆盖(后者会重排数字键,前者保留左边)</li>
</ul>
<p>真正容易被忽略的是:插入后遍历数组时,如果依赖 <code>foreach($arr as $i => $v)</code> 中的 <code>$i</code> 是连续整数,要确认插入没破坏这个假设——<code>array_splice()</code> 会重排数值键,但仅限被操作的那部分,行为可预测;而手动拼接容易遗漏重排逻辑。</p>



















