array_keys用于一次性提取数组所有键名,适用于批量判断或函数传参;不支持递归,值类型需匹配,空数组返回空数组。

array_keys 能直接拿到所有键名,但默认只返回顶层键——嵌套数组的子键它不管,这点很多人踩坑。
什么时候必须用 array_keys 而不是 foreach 遍历取键?
当你需要一次性提取全部键、做批量判断或传给其他函数(比如 array_diff_key)时,array_keys 更简洁安全;foreach 适合边遍历边处理,但手动收集键容易漏掉或顺序错乱。
- 要过滤出特定条件的键(比如只取字符串键),用
array_keys($arr, null, true)配合第三个参数更稳 - 键名含数字且你依赖顺序,注意 PHP 8.0+ 对
array_keys的键序保证比旧版本更严格 - 如果数组很大,
array_keys会新建数组,内存开销比迭代略高,但通常可忽略
array_keys 的第二个参数没生效?检查值类型和严格模式
第二个参数是“查找值”,不是“筛选条件”——它只返回等于该值的所有键。常见错误是传了字符串却忘了数组里存的是整数,或者没开严格比较。
- 写成
array_keys($arr, '1')找不到键对应值为1(int)的项,得用array_keys($arr, 1, true) - 值是浮点数?小心精度问题,
array_keys($arr, 0.1 + 0.2)可能找不到0.3,建议先round()或改用array_filter - 值是对象或数组?
array_keys不支持,会报 Warning:Cannot use object as array —— 这时候只能自己遍历
想递归获取所有键名?别硬套 array_keys
array_keys 本身不递归,强行用 array_walk_recursive 搞键名会丢层级信息,而且无法区分同名键在不同层。
立即学习“PHP免费学习笔记(深入)”;
- 真要扁平化所有键(如
user.name、user.email),得手写递归函数,每次拼接父键 - 只是检查某个键是否存在深层结构?用
isset($arr['a']['b']['c'])或array_key_exists分层查更准 - PHP 7.4+ 可考虑
...$arr展开再调array_keys,但仅适用于一维合并场景,别误用
最常被忽略的一点:空数组传给 array_keys 返回空数组,不是 false 或 null,所以用 empty(array_keys($arr)) 判空没问题,但别拿它当布尔判断依据去分支逻辑——键存在性 ≠ 数组非空。











