PHP数组本质是有序哈希表,键(key)决定访问方式;array_keys()和array_values()分别返回键与值的索引数组,长度相等且顺序一致;foreach($arr as $key=>$value)是最安全的遍历方式。

PHP 中数组下标和键值不是一回事
很多人误以为 $arr[0] 的“0”就是键,其实只在索引数组中成立;关联数组里 $arr['name'] 的 'name' 才是键,而它根本没“下标”概念。PHP 数组本质是有序哈希表,键(key)决定访问方式,数值“下标”只是键的一种类型。
用 array_keys() 和 array_values() 分离键与值
当你需要明确拿到所有键或所有值,这两个函数最直接:
-
array_keys($arr)返回包含全部键的索引数组(顺序与原数组一致) -
array_values($arr)返回包含全部值的索引数组(键重置为 0,1,2…) - 两者长度一定相等,
$keys[2]和$values[2]就是一对原始键值
示例:
$arr = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry']; $keys = array_keys($arr); // ['a', 'b', 'c'] $values = array_values($arr); // ['apple', 'banana', 'cherry']
遍历时用 foreach ($arr as $key => $value) 最安全
这是获取键值配对的标准做法,不依赖数组是否连续、是否为数字键、是否重排过:
立即学习“PHP免费学习笔记(深入)”;
- 不会因
unset()或array_splice()导致键错位 - 兼容索引数组、关联数组、混合数组
- 避免手动用
count()+for循环,后者在关联数组中会丢失键信息
错误写法(只适用于纯索引且连续数组):
for ($i = 0; $i < count($arr); $i++) {
echo $i . ' => ' . $arr[$i]; // 若 $arr 键为 ['x','y','z'],$arr[0] 会报 Notice
}
需要“下标序号”+“原始键值”时,用 array_keys() 配合 foreach
比如你想打印“第1个元素:键='name',值='Tom'”,这里的“第1个”指遍历顺序位置,不是键本身:
- 先调用
$keys = array_keys($arr)获取键列表 - 再用
foreach ($keys as $index => $key),此时$index是顺序下标,$key是原始键 -
$arr[$key]就是对应值
这样既保留了顺序编号,又没丢原始键名,比手动维护计数器更可靠。
注意:PHP 7.4+ 支持解构赋值,但 foreach (array_keys($arr) as $i => $k) 这种写法仍需确保 $arr 不为空,否则 array_keys() 返回空数组,$i 从 0 开始没问题,但别假设 $arr 一定有数据。











