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() 看的是实际键,不是数组“类型”。
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() 再拼回去,既绕路又容易出错。