php数组操作核心在于理解键值结构与可变类型,关键区别包括:array_merge()重排数字键而后覆盖关联键,+运算符左优先不覆盖不重排;array_filter()不传回调时依空值规则过滤但保留’0’;foreach修改需引用或键赋值;count()对未定义变量静默返回0易掩错。

PHP 数组操作的核心不是背函数,而是理解「键值结构」和「可变类型」带来的灵活性与陷阱。用错函数往往是因为没想清楚:你要改原数组,还是生成新数组?要保留键名,还是重排索引?是否允许重复值?
array_merge() 和 + 合并数组的区别在哪
这是最容易混淆的点:array_merge() 会重新索引数字键,而 + 运算符是“左优先、不覆盖、不重排”。
-
array_merge(['a', 'b'], ['c', 'd'])→[0=>'a', 1=>'b', 2=>'c', 3=>'d'] -
['a', 'b'] + ['c', 'd']→[0=>'a', 1=>'b'](右边的0、1键被左边已存在的同名键忽略) - 关联键行为不同:
array_merge(['x'=>1], ['x'=>2])→['x'=>2](后覆盖);['x'=>1] + ['x'=>2]→['x'=>1](前保留) - 如果要无条件拼接且保留所有元素(含重复键),必须用
array_merge();如果想“默认值优先”,用+
array_filter() 不传回调时到底过滤什么
不传第二个参数时,array_filter() 会用 PHP 的“空值判定规则”过滤:false、NULL、0、”、[]、0.0 都会被剔除,但注意 '0' 是字符串,不会被过滤。
-
array_filter([0, '0', false, null, '', 1])→[1]('0'留下了) - 要严格过滤假值又保留
'0',得显式写回调:array_filter($arr, function($v) { return $v !== '' && $v !== null && $v !== false; }) - 如果原数组有非连续数字键,
array_filter()返回结果不会重排索引,需加array_values()才能获得紧凑数字索引
foreach 中修改数组值要注意引用问题
直接遍历修改 $item 不会影响原数组,除非你用引用赋值。
立即学习“PHP免费学习笔记(深入)”;
-
foreach ($arr as $item) { $item = strtoupper($item); }→ 原数组不变 -
foreach ($arr as &$item) { $item = strtoupper($item); } unset($item);→ 修改生效(unset($item)是必须的,否则后续可能意外影响其他变量) - 更安全的方式是用键遍历:
foreach ($arr as $k => $v) { $arr[$k] = strtoupper($v); } - 对多维数组嵌套修改,引用容易引发意外交互,建议优先用
array_map()或递归函数
count() 在空数组和未定义变量上的行为差异
count() 对 null 或未定义变量返回 0,但这不是“安全”,而是“静默失败”。它不会报 Notice,但可能掩盖逻辑错误。
-
count($undefined)→0(不报错,但变量根本不存在) -
count([])→0(正常) - 判断是否为空数组,应先确认变量存在且为数组:
is_array($arr) && count($arr) === 0 - PHP 7.3+ 支持
count()第二个参数COUNT_RECURSIVE,但递归计数性能差,慎用于深层嵌套或大数组
数组函数本身很简单,难的是在不同上下文中判断该不该用、要不要重索引、要不要引用、要不要提前类型检查——这些细节不会报错,但会让 bug 躲在数据流转的缝隙里,直到某次特定输入才暴露。