PHP 数组常用函数有哪些?一份速查清单

阿乐
阿乐 星耀SVIP管理员 黑卡会员
发布于 2026-09-13 14:01 ·2 浏览 ·0 回复

PHP 数组函数真正需要背下来的只有 25 个左右,其余 80 多个属于「用到再查」。结论:日常开发 90% 的数组操作,用下面这份按「增删改查 / 键值 / 遍历回调 / 排序 / 集合运算」五类整理的清单就能覆盖,另外有 5 个坑必须提前记住。

一、增删改查:先分清「改值」和「改结构」

结论:往数组里塞数据和取数据,优先用 array_push / array_pop / array_splice,别用 array_merge 硬拼。

- `array_push($arr, $v)` / `array_pop($arr)`:尾部进出,前者可一次推多个值,后者返回被弹出的元素。
- `array_unshift($arr, $v)` / `array_shift($arr)`:头部进出。注意这两个是 O(n),会重建所有数字键,循环里别用。
- `array_splice($arr, $offset, $len, $replace)`:万能剪刀,一次完成删除+插入,是「在中间插一段」唯一优雅的做法。
- `array_merge($a, $b)` 与 `$a + $b` 的区别是高频考点:`+` 遇到同名键保留左边、不重排数字键;`array_merge` 字符串键后者覆盖前者、数字键全部重新连续编号。配置合并用 `+`,列表拼接用 `array_merge`。

二、键值操作:判断存在性是最容易写错的地方

结论:判断键存在用 `array_key_exists()` 更安全,判断值存在用 `in_array($needle, $haystack, true)` 必须加第三个参数。

`isset($arr['k'])` 在值为 `null` 时返回 false,`array_key_exists()` 返回 true——表单字段允许为 null 时只能用后者。反过来,做「白名单命中」判断时,`isset($allow[$key])` 比 `in_array($key, $allow)` 快得多,因为前者是哈希查找 O(1),后者是线性遍历 O(n)。

配套的还有:`array_keys()` / `array_values()`(取键、取值)、`array_flip()`(键值互换,常用来做去重或反查表)、`array_combine($keys, $values)`(两个数组合成一个)、`array_search()`(按值找键,找不到返回 false,要用 `=== false` 判断)。

三、遍历与回调:array_map / array_filter / array_column 三件套

结论:能用 `array_column()` 提取的,绝不要写 foreach。

`array_column($list, 'name', 'id')` 一行把二维数组转成 `id => name` 的映射表,这是处理数据库结果集最省事的函数;`array_map($fn, $arr)` 对每个元素做同样变换并返回新数组;`array_filter($arr, $fn)` 按条件过滤,不传回调时会剔除所有假值,包括 `0`、`'0'`、`''`、`null`——统计数量时踩过这个坑的人不少,建议永远显式写回调。

`array_reduce($arr, $fn, $init)` 负责把数组「压」成一个值(求和、拼字符串、构建树),`array_walk()` 用于就地修改(要传引用 `&$v`),`array_unique()` 去重后保留的是第一次出现的键,键不连续时记得接一个 `array_values()`。

四、排序:sort 会毁掉键名

结论:需要保留键值对应关系时,一律用 `asort` / `arsort` / `ksort` / `uasort`,不要用 `sort`。

`sort()` 和 `rsort()` 会重新索引数字键、丢失字符串键;`asort()` 按值排、`ksort()` 按键排、`arsort` / `krsort` 是对应倒序;`usort($arr, $cmp)` 用自定义比较函数排序,同样会重新索引,要保键就用 `uasort()`。多维数组按某个字段排序时,`usort` + 飞船运算符是最短写法:`usort($list, fn($a, $b) => $a['sort'] <=> $b['sort']);`

五、集合运算与切片:差集、交集、分块

结论:`array_diff` / `array_intersect` 比手写循环清晰得多,但它们按「值」比较且是 O(n·m),大数据量慎用。

- `array_diff($a, $b)` 取差集、`array_intersect($a, $b)` 取交集,加 `_assoc` 后缀则按键值对整体比较。
- `array_slice($arr, $offset, $len, true)` 切片,第四个参数传 `true` 可保留原键名;分页时它是标准工具。
- `array_chunk($arr, 10)` 分块,批量处理、分批入库常用。
- `count()` / `array_sum()` / `range()` / `compact()` / `extract()` 属于顺手就用的补充项。

六、必须记住的五个坑

结论:这几个坑不记住,代码在测试环境能跑、上生产就出错。

一是 `in_array` 松散比较:`in_array(0, ['a','b'])` 在旧版本会返回 true,PHP 8 已修正但仍建议加 `true`。二是 `array_filter` 保留键,转 JSON 会变成对象而不是数组,记得 `array_values()`。三是 `array_merge` 传入非数组参数(PHP 8 起直接抛 TypeError)。四是 `foreach` 中遍历时修改原数组,要用 `foreach ($arr as $k => &$v)` 并在循环后 `unset($v)`。五是 `array_unique` 对多维数组无效,得先序列化或用 `array_column` 取列去重。

顺带说一句,像 Clara BBS 这类无框架的轻量 PHP 系统,插件钩子里流转的数据结构基本都是数组,写插件时最常用的也就是 `array_column`、`array_merge`、`array_filter` 这几组——把上面的清单过一遍,读别人的代码会顺畅很多。

<!--TAGS-->PHP数组函数,速查清单,PHP开发,数组排序,PHP避坑<!--/TAGS-->

本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-303.html
转载请注明出处,版权归原作者所有。

全部回复 0

还没有回复,来抢沙发~