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

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,是设计行为,但极易引发安全或逻辑漏洞。
jQuery仿京东图片变亮变暗效果,鼠标悬停图片之后该图片变亮,其他图片变暗。移开鼠标所有图片变亮。兼容主流浏览器,php中文网推荐下载! 使用方法: 1、head区域引用文件lrtk.css及js库,animate.js是另外编写的动画函数。
立即学习“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) 返回 0,count($undefined) 也返回 0(触发 notice 但不中断)。这会让“判断数组是否为空”的逻辑失效:
- 错误写法:if (count($arr) === 0) —— $arr 是 null 时也进 if
- 安全写法:is_array($arr) && count($arr) === 0
- 更推荐:empty($arr)(但注意 empty(['']) 为 true,需结合业务判断)










