array_keys()是提取数组所有键名的唯一标准解法,兼容索引与关联数组,返回键名数组且顺序一致,比手动foreach更安全高效。

直接用 array_keys() 拿索引集最稳妥
PHP 里想提取一个数组的所有下标(键名),array_keys() 是唯一标准解法。它不区分索引数组还是关联数组,只要是有键的数组,就能返回包含全部键的数值索引数组。
常见误操作是试图用 range(0, count($arr)-1) —— 这只对「连续、从 0 开始的整数索引」有效,一旦中间有缺失(比如 unset($arr[1]))或用了字符串键(如 ['a' => 1, 'b' => 2]),结果就错得离谱。
-
array_keys($arr)返回所有键,顺序与原数组一致 - 加第二个参数(如
array_keys($arr, 'value'))可筛选对应值的键,但通常不需要 - 第三个参数
true表示严格类型比较,日常不用传
索引数组和关联数组的下标行为完全一致
PHP 并不真有“索引数组”这种独立类型——只有“数组”,键可以是整数或字符串。所谓“索引数组”只是键恰好为 0,1,2... 的数组。所以 array_keys() 对两者毫无区别:
$a = [10, 20, 30]; // 键是 0,1,2 $b = ['x' => 10, 'y' => 20]; // 键是 'x','y' var_dump(array_keys($a)); // [0, 1, 2] var_dump(array_keys($b)); // ['x', 'y']
别被手册里“索引数组/关联数组”的分类误导,array_keys() 看的是实际键,不是数组“类型”。
立即学习“PHP免费学习笔记(深入)”;
注意 foreach 中的 $key 不等于下标集
有人会写 foreach ($arr as $key => $val) { $keys[] = $key; } 来手动收集,这逻辑没错但没必要,且容易漏掉空数组或引用场景下的边界情况。
- 性能上比
array_keys()差,尤其大数组时多一次遍历 - 如果数组在循环中被修改(如
unset()),foreach行为可能不稳定 - 代码更长,可读性反而下降——直接调函数语义清晰
要保留键值对结构?别取下标集,改用 array_keys() + array_values()
如果目标不是“只拿键”,而是想把原数组转成「纯数字索引+保持顺序」的形式(比如为 JSON 输出或某些函数做准备),那该用 array_values($arr),而不是折腾下标集。
例如:json_encode($arr) 对关联数组输出对象、对纯数字索引输出数组,这时真正需要的是重排值,不是提取键。
强行先 array_keys() 再拼回去,既绕路又容易出错。











