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,是设计行为,但极易引发安全或逻辑漏洞。
一个功能强大的B2B与B2C的购物平台,除了原本OSC功能外,增加更新的功能: 一、 取消了register_globals必须开启的限制 二、 將HTML程式碼与PHP程式碼完全分离,採用了smarty 樣板引擎 三、 每支档案includes所需函数与资料库连结,使的网页显示速度明显提升 四、 检视、购买商品群组权限设定 五、 十八岁以下禁购机制 六、 折价券购物抵扣机制 七、 礼券购物机制
立即学习“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,需结合业务判断)










