最稳妥的方法是 array_push(),它专为数组末尾追加设计,语义清晰、行为确定;需确保首参为数组,支持一次追加多个元素,但不支持关联键名赋值。

用 array_push() 追加多个值最稳妥
它专为“在数组末尾加东西”设计,语义清晰、行为确定,不会意外改变原数组结构。比手动写 $arr[] = $val 更适合一次塞多个元素。
常见错误是传入非数组变量导致警告:Warning: array_push() expects parameter 1 to be array。务必先确认变量是数组,比如用 is_array($arr) 或初始化为 []。
使用场景:循环中累积数据、处理表单多选字段、拼接日志条目。
-
array_push($arr, 'a', 'b', 'c')—— 一次性追加三个字符串 -
array_push($arr, ['x' => 1], ['y' => 2])—— 追加两个子数组,不是合并 - 不支持关联键名赋值,想带键名得用
+或array_merge()
$arr[] = $val 是最轻量的单元素追加
这是 PHP 底层直接支持的语法糖,性能略优于 array_push()(尤其单个值时),且不校验参数类型——哪怕 $arr 是 null,也会自动转成数组再赋值(但会触发 notice)。
立即学习“PHP免费学习笔记(深入)”;
容易踩的坑:对索引数组和关联数组行为一致,但新手常误以为它会“保持键名”。实际上它只管追加,新元素永远用下一个整数键(如 0、1、2……),不管前面是不是 ['name' => 'a']。
-
$arr = ['name' => 'Tom']; $arr[] = 'admin';→ 结果是['name' => 'Tom', 0 => 'admin'] - 如果想保留键名并合并,该用
$arr += ['role' => 'admin'] - 重复写
$arr[] = $val十次,就生成十个连续数字键,不是覆盖
别用 array_merge() 给空数组追加
它本意是合并多个数组,不是追加。当第一个参数是空数组 [],第二个是数值数组,结果看似正常;但一旦第二个是关联数组,键名可能被重排或覆盖,行为不可控。
典型错误现象:array_merge([], ['id' => 1, 'name' => 'Lily']) 返回 [0 => 'Lily'](PHP 7.4+ 之后才修复为保留键名),老版本极易出错。
- 数值索引数组可用,但没必要——
$arr[] = ...更直白 - 关联数组慎用,尤其不确定 PHP 版本时
- 真要合并多个数组才轮到它,比如把配置项和默认值合在一起
注意引用与副本的区别
所有上述操作都直接修改原数组。如果变量是函数返回值或从其他地方传来的引用,改动会影响源头。没做 clone 或 array_values() 复制的话,后续逻辑可能读到意外变更后的数组。
最容易被忽略的是 foreach 中边遍历边追加:foreach ($arr as $k => $v) { $arr[] = $v; } —— 这会无限循环,因为每次追加都延长了数组长度,而 foreach 每次迭代都会重新检查长度。
- 需要“复制后扩展”,先
$new_arr = $arr;再操作 - 要避免副作用,函数内追加前加
$arr = $arr ?: [];防 null - 调试时用
var_dump(array_keys($arr))看键名是否符合预期,比只看值更可靠








