array_unshift直接修改原数组并返回新长度,不返回新数组;支持多参数按序插入;会重置关联键为数字索引;时间复杂度o(n),大数组慎用。

array_unshift 会修改原数组,不是返回新数组
很多人以为 array_unshift 像 array_merge 那样返回新数组,结果写成 $new = array_unshift($arr, 'a'),发现 $new 是整数(插入元素个数),而 $arr 却已经被改了——这是它最常被误用的点。
它直接在原数组开头插入一个或多个值,并返回插入后数组的新长度(int)。所以别试图“链式赋值”,要操作原数组本身。
- 错误写法:
$result = array_unshift($arr, 'x')→$result是长度,$arr已变 - 正确写法:
array_unshift($arr, 'x'),之后直接用$arr - 若需保留原数组,先
$new_arr = $arr再对$new_arr调用
支持多个参数,但顺序就是插入顺序
你可以一次插多个值:array_unshift($arr, 'a', 'b', 'c'),结果是 ['a', 'b', 'c', ...原内容]。注意:不是“把整个数组当一个元素插进去”,每个参数都单独作为新元素。
如果想插一个子数组(比如把 ['x','y'] 当作一个元素),必须显式包装:array_unshift($arr, ['x','y']);否则写成 array_unshift($arr, 'x', 'y') 就是两个独立元素。
- 插三个字符串:
array_unshift($arr, '1', '2', '3')→ 开头多出三个元素 - 插一个数组(作为一个元素):
array_unshift($arr, ['a','b']) - 混合类型也合法:
array_unshift($arr, null, true, 42)
关联键名会被重置为数字索引
如果原数组是关联数组(比如 ['name' => 'Alice', 'age' => 30]),调用 array_unshift 后,所有键都会变成数字索引(0, 1, 2...),原来的字符串键名丢失。
这是因为 array_unshift 内部做了「重新索引」,等价于把数组转成纯数值数组再插。如果你需要保持键名结构,不能用它——得手动重建:
- 想保持关联键?用
$new_arr = ['new_key' => 'val'] + $old_arr(注意+是左侧优先) - 或者用
array_merge(['new_key' => 'val'], $old_arr),但注意array_merge对数字键会重排,对字符串键才保留 -
array_unshift只适合你明确想要「数值索引开头插入」的场景
性能上,大数组慎用
array_unshift 时间复杂度是 O(n),因为 PHP 要把原数组所有元素往后挪一位。数组越大,耗时越明显。实测 10 万元素的数组调用一次,比 array_push 慢几十倍。
如果只是临时拼接、不介意顺序,优先考虑 array_merge 或 [] + $arr;如果真要开头插入且数据量大(比如日志队列头部追加),建议换用 SplDoublyLinkedList 或自己维护首尾指针。
- 小数组(
- 中大数组(>10k):压测对比
array_merge(['x'], $arr)和array_unshift($arr, 'x'),前者通常更快 - 高频调用场景:避免在循环里反复
array_unshift
array_unshift 就很自然。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











