同事在循环里写 array_push($rows, $item),一个请求跑下来塞十几万条,我顺手改成 $rows[] = $item,耗时直接掉了一截。这两种写法都能加元素,差别不算大,但用错场景就难受了。

尾部追加,方括号更直接

$list[] = 值 是语法层面的追加,省掉一次函数调用,键自动接着最大整数往后排。array_push 一次可以塞多个参数,比如 array_push($list, $a, $b),返回值是新的元素个数,很多人误以为它返回数组。

指定键就老老实实赋值

$user['name'] = '张三' 这种写法最清楚,键存在就覆盖,不存在就新增。别用 array_push 往关联数组里塞,它只认数字索引,塞进去会多出一个 0 号元素,调试时能让人找半天。

两个容易踩的坑

  • 用 array_push 合并两个数组,结果会变成嵌套数组,要平铺得用 array_merge
  • 循环里 foreach ($arr as &$v) 之后忘了 unset($v),后续追加的数据会被最后一个引用改掉
  • array_push 的第一个参数必须是变量,传函数返回值会报错

PHP 8 里字符串键和数字字符串的处理更严格,$arr['1'] 和 $arr[1] 是同一个键,从表单拿到的数据最好先确认类型。

从表单数据说开去

接收前端传来的多选值,$ids = $_POST['ids']; 拿到的已经是数组,别再当成字符串往里 push。要在这基础上追加固定项,用 $ids[] = 0 把默认值放进去,顺序会影响后续的 in 查询。用 array_unshift 往头部加元素会重建索引,大数组上明显变慢。

还有一个容易忽略的点,array_push 的第一个参数是按引用传的,传字面量会报 Only variables can be passed by reference。写成 array_push($list, ...$more) 展开一个新数组,比循环调用清晰得多。

日常追加就写 $arr[],需要一次加多个用 array_push,合并数组用 array_merge 或者展开运算符,别混着来。