PHP数组添加元素需分场景:[]追加依赖最大整数键,array_push()返回长度且须传值,array_unshift()性能差;关联数组应直接赋值$arr['key'] = $val;合并用array_merge()(数字键重排)或+(保留左键)。

直接用 [] 追加元素最常用,但要注意它不校验键名重复
PHP 数组是哈希表实现的,[] 本质是“追加到末尾并自增整数键”,不是严格意义上的“push”。如果数组已有非连续整数键(比如 [0 => 'a', 2 => 'c']),下一次 $arr[] = 'd' 会生成键 3,而不是 1。这容易让人误以为它总在“最后一位”插入,其实它只看当前最大整数键。
- 适合快速收集数据、循环中累积结果,比如
foreach ($items as $item) { $list[] = $item['id']; } - 如果数组全是字符串键(如
['name' => 'Tom']),[]仍会生成下一个整数键(0),可能破坏结构预期 - 不会覆盖已有键,但也不会报错——静默失败是常见坑点
array_push() 和 array_unshift() 的边界行为
array_push() 看似等价于 [],但它返回新数组长度,且**必须传入至少一个值**;传空数组或没传参数会警告 Warning: array_push() expects at least 2 parameters。而 array_unshift() 往开头插,性能比 array_push() 差——因为要重排所有键值对。
-
array_push($arr, 'x', 'y')可一次加多个,[]每次只能加一个 -
array_unshift($arr, 'first')会把原数组所有键+1,对大数组有明显性能开销 - 两者都不支持关联键插入:想插
['status' => 'done']?得用$arr['status'] = 'done'
关联数组别硬套索引操作,$arr['key'] = $value 才是真·安全
很多初学者看到“添加元素”就条件反射想 array_push() 或 [],结果把关联数组搞成混合键(整数+字符串),后续 foreach 顺序不可控,json_encode() 输出结构混乱。PHP 关联数组本质就是哈希映射,直接赋值最直白、最可控。
- 写
$user['email'] = 'a@b.com'比array_push($user, ['email' => 'a@b.com'])清晰十倍 - 重复赋值同名键会覆盖,这是预期行为,不是 bug
- 注意引号:用
$arr[$key]动态键时,确保$key不为null或空字符串,否则变成$arr[''] = ...,容易漏查
批量合并用 array_merge(),但注意数字键会被重置
想把两个数组“拼起来”?array_merge($a, $b) 是标准解法,但它对**纯数字键数组**会重编号([0,1] + [0,1] → [0,1,2,3]),而对关联键数组则保留原键(['a'=>1] + ['b'=>2] → ['a'=>1,'b'=>2])。这个差异导致很多人合并后发现键乱了,还以为函数坏了。
立即学习“PHP免费学习笔记(深入)”;
- 若需保留数字键原样,改用
$a + $b(加号运算符),但只取左边数组未定义的键 -
array_merge_recursive()可递归合并同名键,适合多维配置合并,但会把同名值转成数组,可能不符合预期 - 大数组合并时,
array_merge()内存复制开销明显,单次追加不如循环[]
真正麻烦的从来不是“怎么加”,而是加完之后键是不是你想要的、顺序有没有被意外打乱、后续用 json_encode() 或 foreach 时会不会出人意料——这些细节在调试时才露头,但写的时候最容易忽略。










