应使用 is_int($key) 判断php数组键名是否为数字,因它仅匹配整型键(如0、-5),不误判字符串数字(如"1")或浮点数;配合 array_filter_use_both 可在 array_filter 中准确筛选非数字键。

怎么判断 PHP 数组键名是数字
PHP 中的「数字键名」实际指 is_numeric($key) 为 true 的键,但要注意:PHP 数组的「数字索引」(如 0、1)和「字符串数字键」(如 "1"、"007")在 foreach 中行为一致,但 array_filter() 默认不区分。真正可靠的判断方式是用 is_int($key) 检查是否为整型键,或用 ctype_digit((string)$key) && $key[0] !== '0' 排除前导零字符串——不过绝大多数场景只需剔除纯整数键。
用 array_filter + array_keys 剔除整数键名项
直接遍历键名比操作值更稳妥,因为 array_filter() 默认只传值,不传键。必须配合 array_keys($arr, null, true) 或用回调函数捕获键:
function removeNumericKeys($arr) {
return array_filter($arr, function($v, $k) {
return !is_int($k); // 注意:$k 是键,不是值
}, ARRAY_FILTER_USE_BOTH);
}
关键点:
-
ARRAY_FILTER_USE_BOTH必须显式传入,否则$k不可用 -
is_int($k)只匹配真正的整数键(如0、-5),不匹配"1"或1.5 - 该函数返回新数组,原数组不变;若需重置键名,再套一层
array_values()
为什么 isset($arr[0]) 或 key() 不能用来筛键
这些是访问操作,不是键名判定工具:
立即学习“PHP免费学习笔记(深入)”;
-
isset($arr[0])只检查是否存在索引0的元素,无法遍历所有键 -
key($arr)只返回当前内部指针位置的键,需配合next()手动遍历,易出错且低效 - 误用
is_numeric($key)会把"123"、"-45"、"1e2"全部干掉,而它们在数组中属于字符串键,PHP 并不自动转换为整数键
注意 array_merge 和 JSON 编码对键名的影响
筛完后若做后续处理,容易踩坑:
-
array_merge($arr)会把所有字符串键保留,但所有整数键重排为连续数字索引——这会「复活」你刚剔除的数字键语义 -
json_encode()遇到混合键名数组时,整数键会被当成列表索引,字符串键才生成对象属性;筛掉整数键后,结果更可能被解析为 JSON 对象而非数组 - 如果源数组来自
json_decode($json, true),它本身不会产生字符串数字键(如"1"),但手动赋值时可能混入,建议筛之前先用var_dump(array_keys($arr))确认键类型
最常被忽略的是:is_int() 判定严格,但 PHP 数组键在底层会强制转换——比如 $arr[1] = 'a'; $arr["1"] = 'b'; 实际只存一个元素,后者覆盖前者。筛键前最好确认数据来源是否已存在隐式转换。











