单元素追加时优先用 $arr[] = $value,因其是语言语法、无函数调用开销,比 array_push($arr, $value) 快15%–20%,且对未定义变量自动初始化数组;array_push 仅适合批量追加或多值场景。
![php索引数组用 array_push 和 [] 追加有什么区别](https://img.php.cn/upload/article/001/431/639/178840754660222.jpeg?x-oss-process=image/resize,p_40)
array_push 和 $arr[] 都能追加,但性能和语义不同
单元素追加时,$arr[] = $value 比 array_push($arr, $value) 更快,因为前者是语言内置语法,后者是函数调用,有栈帧开销。PHP 官方文档明确建议:「如果只是加一个元素,不如用 $array[]」。
实测 100 万次单元素追加,array_push 平均慢 15%–20%,差异来自参数解析、引用检查和返回值处理。批量追加(如一次加 3 个以上)时,array_push 的可读性略优,但性能差距收窄。
-
array_push必须传入数组变量,若传错类型(比如传了null或字符串),会触发Warning: array_push() expects parameter 1 to be array -
$arr[] = $value对非数组左值更宽容:如果$arr未定义或为null,它会自动初始化为数组;而array_push不会帮你创建数组 - 两者都忽略原数组的字符串键名,新元素始终以递增数字键(
0,1, …)追加,不改变已有键值对
关联数组末尾追加时,两者行为一致但不保留键名意图
如果你有一个带字符串键的索引式数组(比如 $data = ['name' => 'Alice', 'age' => 30]),再用 array_push($data, 'active') 或 $data[] = 'active',新增元素都会变成数字键 0,而非你可能期待的 'status' —— 这不是 bug,是设计使然。
PHP 数组本质是有序映射,array_push 和 [] 都按「栈」语义操作,只关心顺序位置,不推断键名逻辑。想加带键的元素,得显式写 $data['status'] = 'active',或者用 += 合并:$data += ['status' => 'active']。
- 不要指望
array_push能“智能延续键名”,它只管数字索引增长 - 若数组混合了字符串键和数字键(如
['a'=>1, 2=>3]),[]和array_push都会在最大数字键 +1 处插入,不会重排已有数字键 - 对空数组
[],两者都从键0开始
错误场景下表现差异明显:未定义变量 vs 类型错误
这是最容易踩坑的地方。假设你写了 array_push($items, 'new');,但 $items 根本没声明过,或被赋值为 42 或 'hello':
-
array_push立即抛出警告:Warning: array_push() expects parameter 1 to be array, int given -
$items[] = 'new'则静默创建数组:$items变成[0 => 'new'],不报错也不提示 - 这种宽容性在快速原型中省事,但在严格模式或静态分析(如 PHPStan)下可能掩盖逻辑错误
- 如果依赖
array_push的返回值(新长度)做判断,而传入非法值,返回0且触发警告,容易导致后续逻辑误判
PHP 7.3+ 允许单参数调用 array_push,但无实际优势
PHP 7.3 起支持 array_push($arr)(无值参数),此时函数不添加任何元素,只返回当前数组长度。但这纯属兼容性补丁,没有实用价值——你直接用 count($arr) 更清晰、零开销。
别为了“语法统一”而强行用 array_push 包裹单元素操作。真正该用它的场景只有两个:需要一次压入多个值(array_push($arr, $a, $b, $c)),或代码风格强制要求函数式写法(如某些 DSL 封装)。
复杂点在于:很多人把「习惯写 array_push」当成“更正规”,其实恰恰相反——在现代 PHP 中,[] 语法更底层、更稳定、更少隐式副作用。函数调用带来的警告机制和返回值语义,在简单追加场景下反而增加了理解成本。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











