写导入脚本时图省事,循环里一行 array_push($rows, $item),跑完打印出来发现结构不对,多了一层嵌套,前端表格整片空白。这个函数不难,坑都在细节上。

原型、返回值、传参方式

签名是 array_push(数组, 值1, 值2...),第一个参数按引用传,函数返回压入之后数组的元素个数。所以写 $n = array_push($a, 1) 拿到的 1 是长度,不是数组本身。这个返回值最容易被误用,后面直接 foreach 就会报错,因为变量已经变成整数了。

和 $arr[] 的差别

只加一个元素时,$arr[] = $v 更快,省一次函数调用,也不受引用传参的限制。array_push 的优势是一次能塞多个值,参数个数不限。压进去的键永远是数字键,取当前最大整数键加一,数组里已有的字符串键不参与这个计数。

$list = []; array_push($list, 'a', 'b'); $list[] = 'c';

三个高频错误

  • 把数组当值压:array_push($a, $b) 里 $b 本身是数组,结果就是二维。要合并两个数组应该用 array_merge。
  • 传了非数组:PHP 7 给一条 warning 并返回 null,PHP 8 直接抛 TypeError,老项目升级时这类报错会集中爆出来。
  • 拿返回值当数组:$a = array_push($a, 1) 之后 $a 变成整数,后续所有操作全崩,而且报错位置离真正原因很远。

什么时候别用它

循环里几十万次追加,用 $arr[] 能省下可观的函数调用开销。要合并两个数组,array_merge 保留字符串键、重新编号数字键,语义比连续 push 清楚。往头部加元素用 array_unshift,但它每次都要重建索引,大数组上很慢。取末尾配 array_pop,取头部配 array_shift,这四个函数经常一起出现,记住 push 加尾、shift 动头就不会混。

  • 判断提醒:数据出现意外嵌套时,先查是不是把数组 push 进去了,再看合并逻辑,八成不是函数本身的锅。