php数组考点聚焦键类型转换、函数行为差异及遍历修改陷阱:数字字符串键自动转整型,“a”=>1后赋“a”=>2则覆盖;array_merge()重排数字键、保留字符串键,in_array()需显式true才严格比较,foreach引用需unset($v)防污染。

PHP 数组是面试中高频出现的基础考点,既考察语法细节,也检验对数据结构的理解和实际调试能力。掌握常见陷阱、函数行为差异和键值处理逻辑,往往比死记硬背更重要。
数组定义与键类型陷阱
PHP 数组是“有序映射”,支持混合键(整数/字符串),但隐式类型转换容易出错:
- 数字字符串键(如
"1")会被自动转为整型键1,与纯字符串键(如"01")行为不同 -
[]和array()在 PHP 5.4+ 等价,但低版本不支持短语法;PHP 8.1+ 开始废弃array()的“引用传递”写法(如array(&$a)) - 重复键时,后赋值覆盖前值:
['a' => 1, 'a' => 2]结果为['a' => 2]
常用函数的行为边界
面试常问“为什么这个函数没按预期工作”,核心在于理解参数顺序、键保留规则和返回值类型:
-
array_merge():只对数字键重排索引,字符串键冲突时后者覆盖前者;空数组参与合并无副作用 -
array_push()/array_pop():修改原数组,返回新长度 / 被删元素;不能用于关联数组的“栈操作”(因不保证顺序) -
in_array($val, $arr, true):第三个参数必须显式设为true才做严格比较,否则0 == 'abc'会误判为存在 -
array_keys()和array_values():始终返回索引数组,丢失原始键名或顺序信息
引用、遍历与修改的典型误区
循环中修改数组内容是高频踩坑点,尤其涉及引用和键值变化:
立即学习“PHP免费学习笔记(深入)”;
-
foreach ($arr as $k => &$v):使用引用后,必须unset($v)否则下次循环可能污染变量 - 在
foreach中unset()当前元素:不影响当前迭代,但后续键若被重排,可能导致跳过元素(尤其数字索引) -
foreach ($arr as $v)是值拷贝,修改$v不影响原数组;要改原值需用&$v或通过键$arr[$k] = ...
实战小技巧:快速判断与调试
遇到数组相关问题,优先用这几个动作定位:
- 打印结构:
var_dump($arr)比print_r()更准,能显示 NULL、布尔值类型和引用标记 - 检查键是否存在:
array_key_exists($k, $arr)区分isset($arr[$k])(后者对null值返回 false) - 安全取值:
$val = $arr[$k] ?? 'default';(PHP 7+ 空合并运算符)比三元更简洁 - 去重并保持顺序:
array_values(array_unique($arr)),注意array_unique()默认松散比较
不复杂但容易忽略——多数数组问题不在“会不会用”,而在“是否清楚某一步到底改了什么、返回了什么、键还存不存在”。多动手验证,比背函数列表有效得多。











