
直接用 [] 追加元素最常用,但要注意它和 array_push() 的行为差异
PHP里往数组末尾加一个值,[] 语法最轻量、最直观。它本质是让PHP自动分配下一个整数键,比如 $arr[] = 'x'; 等价于 $arr[count($arr)] = 'x';。而 array_push() 是函数调用,开销略高,且不支持引用传递——如果数组是引用变量,array_push() 会触发复制(尤其大数组时可能意外变慢)。
常见错误现象:array_push($arr, $val) 返回的是新长度,不是数组本身,有人误写成 $new_arr = array_push($arr, $val); 结果得到一个数字。
-
[]适合单个追加,简洁安全 -
array_push()只在需要一次推多个值时才值得用,比如array_push($arr, $a, $b, $c); - 对关联数组用
[]不影响已有键,它只管整数索引递增
用 array_merge() 合并数组时,键名冲突会导致覆盖或重排
想把两个数组“拼起来”,别默认用 array_merge()。它对数字键会重置索引(变成 0,1,2…),对字符串键则后一个数组的同名键会覆盖前一个——这不是“添加”,是“合并+覆盖”。如果你只是想把另一个数组所有元素追加到当前数组末尾,又保留原键结构,得手动遍历或用 + 运算符(但 + 会忽略重复键,不报错也不警告)。
使用场景:从数据库查出两批结果,想合并展示,但又不想丢失各自原始键名或顺序。
立即学习“PHP免费学习笔记(深入)”;
- 要保留数字键顺序 + 不重排:用
foreach遍历后[]追加 - 确定全是字符串键且允许覆盖:
array_merge($a, $b)没问题 - 想保留所有键、不覆盖也不重排:用
$a + $b,但注意$b中同名键不会生效
array_unshift() 和 array_splice() 插入位置不同,性能也差很多
想插到开头或中间?array_unshift() 只能插开头,且会重排所有数字键(O(n) 时间);array_splice() 更灵活,支持任意位置插入,但它内部要移动后续元素,大数据量时明显变慢。关键是:两者都修改原数组,没有“返回新数组”的纯函数式选项。
常见错误现象:循环中反复用 array_unshift() 往空数组加元素,结果越往后越慢——因为每次都要把已有元素往后挪一位。
- 只插开头、数据量小(array_unshift($arr, $val)
- 插中间或开头、数据量大:先用
[]追加,最后用ksort()或自定义排序,比反复挪快得多 - 必须保持插入顺序且位置精确:改用 SplFixedArray 或预分配足够空间的普通数组,减少动态扩容
关联数组用 $arr['key'] = $val 最稳,但别和 isset() 逻辑搞混
给关联数组加新键值对,直接赋值最可靠。$arr['name'] = 'Tom'; 不管 name 原来存不存在,都会设置或覆盖。容易踩的坑是后续用 isset($arr['name']) 判断是否存在——如果 $arr['name'] = null;,isset() 就返回 false,看似“没这个键”,其实是值为 null 被判失效了。
使用场景:接收用户提交的表单字段,有些字段可能为空字符串或 null,但你仍需记录“该字段被提交过”。
- 判断键是否存在,用
array_key_exists('key', $arr),它不关心值是不是null - 想区分“未设置”“设为
null”“设为空字符串”,就别依赖isset() - 批量设置多个关联键值,避免写一堆
$arr['a'] = ...; $arr['b'] = ...;,改用array_replace($arr, ['a'=>..., 'b'=>...])
[] 就够了。真正麻烦的是那些边界情况:键名冲突、null 值语义、大数组性能、是否要保留顺序——这些地方一不留神,调试时看到的数组结构就和你脑内模型对不上。











