array_unshift() 是在索引数组开头插入元素的最直接、安全方式,修改原数组并重排数字键为连续索引(从0开始),支持多值和任意类型,但不保留稀疏键,时间复杂度o(n)。

用 array_unshift() 在索引数组开头插入元素
array_unshift() 是 PHP 原生函数,专为在数组开头追加一个或多个元素设计。它会修改原数组,返回新长度,且自动重排所有数字键(即保持索引连续、从 0 开始)。这是最直接、最安全的方式。
- 插入单个值:
array_unshift($arr, 'new_first'); - 插入多个值:
array_unshift($arr, 'a', 'b', 'c'); - 支持任意类型值(字符串、数字、数组、
null等) - 不适用于关联数组的“键名保留”场景——它只管重排数字键,原有关联键不受影响,但开头插入后,后续纯数字键一定会被重写
为什么不用 array_merge() 或手动拼接?
有人试过 array_merge(['new'], $arr),看似可行,但有隐性风险:如果 $arr 是“空索引数组”(如 array() 或 []),结果没问题;但若 $arr 是带字符串键的混合数组(比如 ['a' => 1, 2 => 3]),array_merge() 会把数字键转为顺序索引,导致结构意外改变。而 array_unshift() 明确只操作“索引部分”,语义清晰、行为稳定。
-
array_merge(['x'], [0 => 'a', 1 => 'b'])→[0 => 'x', 1 => 'a', 2 => 'b']✅ -
array_merge(['x'], ['k' => 'v', 0 => 'a'])→[0 => 'x', 1 => 'v', 2 => 'a']❌(丢失键'k') -
array_unshift()要求输入必须是数组,传入非数组会警告;array_merge()对非数组参数更宽容,但这反而掩盖类型错误
插入后如何确认键是否重排正确?
索引数组插入后,PHP 保证数字键从 0 连续递增。但如果你之前用 unset() 删除过中间元素,再调用 array_unshift(),它仍会重排——不是“补空位”,而是“全量重编号”。这点容易误判。
- 原始:
$arr = [0 => 'a', 2 => 'c']; // 实际是 ['a', 'c'],键为 0 和 2 -
array_unshift($arr, 'x');后变成:[0 => 'x', 1 => 'a', 2 => 'c'](不是[0 => 'x', 1 => 'a', 3 => 'c']) - 验证方式:
var_dump(array_keys($arr));查看是否输出[0, 1, 2] - 若需保留稀疏键,就不能用
array_unshift(),得改用+$arr拼接并手动处理键,但那就不是“索引数组”了
性能和兼容性注意点
array_unshift() 时间复杂度是 O(n),因为要移动所有现有元素。对上万元素的数组频繁调用会影响性能。PHP 5.6+ 和所有现代版本都支持,无兼容问题。
- 替代思路(仅限极大数据集):用 SplFixedArray 预分配空间,或改用栈式结构(
array_push()+ 反向遍历)避免开头插入 - 不要在 foreach 循环中调用
array_unshift()修改正在遍历的数组——PHP 会按原始键快照迭代,新增的首元素不会被本轮循环访问到 - 如果数组来自 JSON 解码(
json_decode($str, true)),默认就是索引数组,可直接用;若解码时用了false,得到的是对象,必须先强制转数组:(array)$obj
array_unshift() 就是最干净的选择。唯一需要多想一拍的,是你是否真的需要“索引数组”这个语义——如果之后还要靠键做查找或依赖稀疏结构,那开头插入本身可能就是设计信号。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











