PHP 数组函数使用误区汇总

4次阅读

php数组函数高频误区:array_merge()重置数字键,应改用+或array_replace();in_array()需显式启用严格比较;array_keys()/array_values()对大数组性能差;count()对NULL返回0,判空应先is_array()或用empty()。

PHP 数组函数使用误区汇总

PHP 数组函数看似简单,但实际使用中常因语义理解偏差、参数顺序记混、返回值类型误判或边界情况忽略,导致逻辑错误或性能问题。下面整理几个高频误区,帮你避开“写得出来,跑得不对”的坑。

array_merge() 会重置数字键,别当“拼接”用

很多人以为 array_merge($a, $b) 就是把两个数组连起来,但对索引数组(纯数字键)它会重新编号,丢失原始键位:

$a = [10, 20];<br>$b = [30, 40];<br>print_r(array_merge($a, $b)); // [10, 20, 30, 40] —— 看似正常<br><br>$a = [0 => 'x', 2 => 'y'];<br>$b = [1 => 'z'];<br>print_r(array_merge($a, $b)); // [0=>'x', 1=>'y', 2=>'z'] —— 原来的键 2 被重排了!

如果需要保留键名(尤其关联+索引混合),改用 + 运算符(左操作数优先,不重排):

  • $a + $b:仅合并键名不重复的元素,不改变原键
  • array_replace():可覆盖同名键,适合配置合并场景

in_array() 默认松散比较,字符串数字易误判

in_array(‘1’, [true, false, 0]) 返回 true —— 因为默认开启类型转换,’1′ == true 成立。这不是 bug,是设计行为,但极易引发安全或逻辑漏洞。

立即学习PHP免费学习笔记(深入)”;

正确做法:始终显式传入第三个参数 true 启用严格比较:

  • in_array(‘1’, $arr, true):类型和值都必须匹配
  • 检查布尔值、0/1、空字符串等敏感值时,必须加 true

array_keys() / array_values() 不改变原数组,但返回新数组开销不小

这两个函数返回全新数组,对大数组(如上万条记录)反复调用会明显拖慢性能,尤其在循环内:

  • 避免 foreach (array_keys($data) as $k) —— 改用 foreach ($data as $k => $v)
  • 不需要键或值时,别为了“看起来清楚”而多套一层函数
  • 若只需判断是否存在某键,直接用 isset($arr[$key])array_key_exists(),比先取 keys 再 in_array 快得多

count() 对 null 或未定义变量返回 0,不是报错

count(null) 返回 0count($undefined) 也返回 0(触发 notice 但不中断)。这会让“判断数组是否为空”的逻辑失效:

  • 错误写法:if (count($arr) === 0) —— $arr 是 null 时也进 if
  • 安全写法:is_array($arr) && count($arr) === 0
  • 更推荐:empty($arr)(但注意 empty([”]) 为 true,需结合业务判断)

text=ZqhQzanResources