学PHP数组函数应从真实问题出发而非死记硬背:用+保留左数组键优先级,array_merge()覆盖同名键并重排索引,array_replace_recursive()用于递归合并;in_array()须加严格模式参数true防类型转换陷阱;查键存在用array_key_exists()或isset();抽列用array_column();判空优先count()===0。
直接上手学比死记函数列表有效得多:PHP数组函数不是靠背下来的,而是靠在真实场景里反复用、踩坑、再修正形成的肌肉记忆。别从“array_merge() 是什么”开始,从“我要把两个用户列表合并,但不能丢掉 ID 键”这种问题出发。
遇到合并数组时键被重排或覆盖,先看用的是
还是
这是最常翻车的点。比如你有:
用
→
(前者键保留)
用
→
(后者同名键覆盖前者)
立即学习
“
PHP免费学习笔记(深入)
”;
要保留第一个数组的键优先级,且不重排数字索引 → 用
要合并后统一重编号索引(如处理
多次提交)→ 用
要递归合并多维结构(比如用户配置 + 默认配置),别用这两个 → 改用
查不到值?检查是否开了严格模式
写
返回
,但这是靠类型转换硬凑出来的,隐患很大。
实际中常见错误:
也返回
(因为
转成 int 是 0)。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
永远显式传第三个参数
:
→
查键是否存在,别用
,改用
或
(注意
对
值返回
)
从多维数组里抽一列,别手动 foreach,直接用
比如你有一组用户数据:
,想拿所有
值。
别这么写:
直接:
还能指定新数组的键:
→
PHP 7.4+ 支持传回调函数做转换,但多数情况不需要;真要加工,
更直白
如果数据源是对象数组,
不支持,得先
判断数组为空,别只用
是
,没问题;但
也是
(因为
被判定为“空值”),而它其实长度是 1。
要确认数组**元素个数为 0** → 用
要确认数组**没有有效值(全为 false/null/''/0 等)** → 才用
对关联数组,
配合
没必要,
本身已统计所有键值对
真正卡住人的,往往不是函数不会用,而是没意识到 PHP 数组同时承载了「有序列表」和「字典映射」两种语义——同一段代码里混用这两种意图,又不加约束,结果就是键莫名消失、顺序错乱、类型隐式转换出 bug。盯住你的数据结构到底要表达什么,函数只是工具。
+array_merge()$a = ['id' => 1, 'name' => 'Tom']; $b = ['id' => 2, 'email' => 't@x.com'];$a + $b['id' => 1, 'name' => 'Tom', 'email' => 't@x.com']array_merge($a, $b)['id' => 2, 'name' => 'Tom', 'email' => 't@x.com']+$_POST['items'][]array_merge()array_replace_recursive()in_array()in_array('1', [1, 2, 3])truein_array(0, ['off', 'on'])true'off'truein_array('1', [1, 2, 3], true)falsein_array()array_key_exists('key', $arr)isset($arr['key'])isset()nullfalsearray_column()$users = [['id'=>1,'name'=>'A','role'=>'admin'], ['id'=>2,'name'=>'B','role'=>'user']]name$names = [];
foreach ($users as $u) {
$names[] = $u['name'];
}$names = array_column($users, 'name');array_column($users, 'name', 'id')[1 => 'A', 2 => 'B']array_map()array_column()array_map('get_object_vars', $objs)empty()empty([])trueempty([null])truenullcount($arr) === 0empty($arr)array_keys($arr)count()count()