在PHP开发里,关联数组是最常用的数据结构之一,它的键可以是字符串,用来表达有明确含义的字段名。当我们需要把数组里的每一对键和值都取出来做日志、组装SQL或接口返回时,不能只关心值而忽略键。只有同时拿到键名和键值,才能还原数据的完整语义。

使用foreach同时获取键和值
foreach是PHP为遍历数组专门提供的语法,对关联数组尤其友好。它可以在一次循环中直接把当前元素的键赋给一个变量,把值赋给另一个变量,不需要先调用array_keys再去取下标。
下面这段代码演示了如何从用户资料数组中取出每一对键值并打印。注意键变量在foreach语法中写在值变量前面,用=>连接。
<?php
$user = array(
'name' => '张三',
'age' => 28,
'email' => 'test@ipipp.com'
);
foreach ($user as $key => $value) {
echo '字段:' . $key . ',内容:' . $value . "n";
}
?>
上述写法的优点是语义清晰,循环体内部随时可以使用$key判断字段类型,用$value拿到数据。如果某些字段需要特殊处理,比如邮箱要脱敏,直接在循环里加条件即可。
另外,foreach还支持用引用符号&修改原数组的值。但引用遍历结束后必须把变量 unset,否则后续代码若复用该变量名会影响原数组。下面展示引用修改年龄字段加一的操作。
<?php
foreach ($user as $key => &$value) {
if ($key == 'age') {
$value = $value + 1;
}
}
unset($value);
print_r($user);
?>
用while和each的旧写法为什么不推荐
在较早的PHP版本中,开发者常用each函数配合while循环来遍历关联数组。each会返回包含当前键值对的数组,并把内部指针向后移动。这种写法如今已被官方标记为过时。
主要问题在于each返回的是新数组,每次循环都会产生临时结构,内存开销大;而且代码可读性不如foreach。下面的示例仅作了解,新项目不应再使用。
<?php
while (list($k, $v) = each($user)) {
echo $k . ':' . $v . "n";
}
?>
由于each在PHP 7.2起被弃用,并在后续版本中移除,依赖它的代码会遇到致命错误。因此统一使用foreach才是获取关联数组键值对的安全方案。
遍历时键名类型的注意点
PHP关联数组的键如果是整数字符串如'10',会被自动转为整数10。在严格比较时,用全等号判断键名要留意类型变化。下面的表格列出常见键写法在遍历中的表现。
| 写的键 | 实际存储键类型 | 遍历中$key类型 |
|---|---|---|
| 'name' | string | string |
| '10' | int | int |
| true | int(1) | int |
理解这个机制可以避免在循环里用$key === '10'却匹配不到的坑。若业务要求键必须是字符串,最好在赋值前保证不被PHP强制转换,或者在判断时用==宽松比较。
综上,PHP遍历关联数组键值对最稳妥的方式就是foreach配合$key=>$value语法。它语法简单、性能优秀,也能在循环中安全地读取或修改数据,是日常获取完整数据的首选做法。