PHP数组怎么操作_常用数组函数使用指南【指南】

1次阅读

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

PHP数组怎么操作_常用数组函数使用指南【指南】

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'](右边的 01 键被左边已存在的同名键忽略)
  • 关联键行为不同: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 躲在数据流转的缝隙里,直到某次特定输入才暴露。

text=ZqhQzanResources