⭐ 推荐:社区规则条款 V1.0

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

玄墨染
玄墨染 正式会员正式会员认证极客认证极客
发布于 2026-08-18 01:44 ·103 浏览 ·0 回复
内容摘要

PHP数组函数只需掌握约25个常用函数,其余用到再查;日常开发约90%的数组操作可依靠按增删改查、键值、遍历回调、排序和集合运算五类整理的速查清单完成,并需注意array_merge与+、isset与array_key_exists、in_array严格判断及array_filter假值等常见陷阱。

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 这几组——把上面的清单过一遍,读别人的代码会顺畅很多。

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

全部回复 0

还没有回复,来抢沙发~