学php数组函数应从真实问题出发而非死记硬背:用+保留左数组键优先级,array_merge()覆盖同名键并重排索引,array_replace_recursive()用于递归合并;in_array()须加严格模式参数true防类型转换陷阱;查键存在用array_key_exists()或isset();抽列用array_column();判空优先count()===0。

直接上手学比死记函数列表有效得多:PHP数组函数不是靠背下来的,而是靠在真实场景里反复用、踩坑、再修正形成的肌肉记忆。别从“array_merge() 是什么”开始,从“我要把两个用户列表合并,但不能丢掉 ID 键”这种问题出发。
遇到合并数组时键被重排或覆盖,先看用的是 + 还是 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]) 返回 true,但这是靠类型转换硬凑出来的,隐患很大。
实际中常见错误:in_array(0, ['off', 'on']) 也返回 true(因为 'off' 转成 int 是 0)。
- 永远显式传第三个参数
true:in_array('1', [1, 2, 3], true)→false - 查键是否存在,别用
in_array(),改用array_key_exists('key', $arr)或isset($arr['key'])(注意isset()对null值返回false)
从多维数组里抽一列,别手动 foreach,直接用 array_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'] - PHP 7.4+ 支持传回调函数做转换,但多数情况不需要;真要加工,
array_map()更直白 - 如果数据源是对象数组,
array_column()不支持,得先array_map('get_object_vars', $objs)
判断数组为空,别只用 empty()
empty([]) 是 true,没问题;但 empty([null]) 也是 true(因为 null 被判定为“空值”),而它其实长度是 1。
- 要确认数组**元素个数为 0** → 用
count($arr) === 0 - 要确认数组**没有有效值(全为 false/null/''/0 等)** → 才用
empty($arr) - 对关联数组,
array_keys($arr)配合count()没必要,count()本身已统计所有键值对
真正卡住人的,往往不是函数不会用,而是没意识到 PHP 数组同时承载了「有序列表」和「字典映射」两种语义——同一段代码里混用这两种意图,又不加约束,结果就是键莫名消失、顺序错乱、类型隐式转换出 bug。盯住你的数据结构到底要表达什么,函数只是工具。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











