array_keys 返回原数组所有键名组成的索引数组,不修改原数组;传入第二个参数时默认松散匹配,需第三个参数 true 实现严格匹配;搭配 array_flip 时需确保值为字符串或整数。

array_keys 会返回什么?
array_keys 返回的是原数组所有键名组成的索引数组,不是值,也不是键值对。它不改变原数组,纯读取操作。
- 如果原数组是关联数组(比如
['a' => 1, 'b' => 2]),返回['a', 'b'] - 如果是纯数字索引数组(比如
[10, 20, 30]),返回[0, 1, 2] - 键名类型会被保留:字符串键还是字符串,整数键还是整数(但输出时可能被 PHP 自动转成 int)
注意:如果原数组为空,array_keys 返回空数组 [],不是 null 或 false。
第二个参数 $search_value 怎么精确匹配?
传入第二个参数时,array_keys 只返回对应值的键名,但默认是「松散比较」(==),不是严格比较(===)。
-
array_keys(['a' => 0, 'b' => '0'], 0)会同时匹配'a'和'b',因为'0' == 0为 true - 要避免误匹配,必须显式传入第三个参数
true:array_keys(['a' => 0, 'b' => '0'], 0, true)→ 只返回['a']
常见踩坑点:在处理 API 返回的混合类型数据(比如 JSON 解码后数字变字符串)时,漏掉 true 导致键名捞错。
立即学习“PHP免费学习笔记(深入)”;
和 array_values、array_flip 搭配用要注意什么?
array_keys 常和这两个函数连用,但行为差异大:
-
array_values($arr)重排索引,只保留值,丢弃原键名 -
array_flip($arr)交换键和值,要求值必须能当合法键(即 string 或 int),否则会丢键
比如:$arr = ['x' => 1, 'y' => null, 'z' => []]
-
array_keys($arr)→['x', 'y', 'z'](安全) -
array_flip($arr)→Warning: array_flip(): Can only flip STRING and INTEGER values!,且只保留[1 => 'x'],其余丢失
所以想“提取键名做后续判断”,直接用 array_keys 最稳妥;想“反转映射关系”,先确认值是否全为标量。
性能和大数组要注意的边界
array_keys 时间复杂度是 O(n),遍历一次即可,本身很快。但实际慢往往出在别处:
- 对超大数组(比如 10 万+ 元素)反复调用,尤其带
$search_value参数时,每次都要全量扫描 - 在循环里写
in_array($k, array_keys($arr))是典型反模式——相当于双重循环,应改用isset($arr[$k])或array_key_exists($k, $arr)
另外,PHP 7.4+ 中,如果原数组有大量重复值,用 array_keys($arr, $val) 返回的键名顺序和原数组遍历顺序一致,这点可依赖;但不要假设它自动去重——相同值对应的多个键都会返回。



















