PHP 数组常用函数有哪些?一份速查清单
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 这几组——把上面的清单过一遍,读别人的代码会顺畅很多。
转载请注明出处,版权归原作者所有。
正式会员
认证极客






