PHP不支持浮点数键,定义时即截断为整数(如3.7→3、-2.9→-2),array_keys()返回转换后的整数键,无法还原原始浮点形式;字符串键如"3.7"则原样保留。

PHP 7.1 中,array_keys() 对含浮点数键名的数组处理时,**不会自动转换键名类型**,但 PHP 数组本身对浮点数键有隐式转换规则——这是问题根源所在。
浮点数键在数组定义时就被强制转为整数
PHP 不支持真正的浮点数作为数组下标。当你用浮点数(如 3.7、0.0、-2.9)作键时,PHP 在存储前就按规则做了截断或转换:
-
正浮点数:直接截去小数部分,等价于
(int)强制转换(非四舍五入),例如3.9→3,0.999→0 -
负浮点数:同样截断,
-2.9→-2,-0.5→0(因为(int)-0.5是0) -
科学计数法或极小值:如
1e-5或0.00001→ 转为0;1e10若超出int范围,可能转为0或触发警告(取决于平台)
array_keys() 返回的是“实际存储的键”,不是原始写法
它只是把数组当前真实存在的键名提取出来。由于浮点键早在赋值时就已转换,array_keys() 拿到的已经是整数键了:
$arr = [3.7 => 'a', -2.9 => 'b', 0.0 => 'c']; print_r($arr); // 输出: // Array ( [3] => a [−2] => b [0] => c ) print_r(array_keys($arr)); // 输出: // Array ( [0] => 3 [1] => −2 [2] => 0 )
你无法通过 array_keys() 知道原始键是不是浮点数——PHP 已经“忘记”了。
立即学习“PHP免费学习笔记(深入)”;
如何判断某个键是否曾是浮点数?
PHP 本身不保留该信息,所以无法可靠回溯。但可从源头规避:
- 避免用浮点数当键;如需表示带精度的标识,转成字符串:
'3.7'、'-2.9' - 若必须用数值键且需区分精度,统一转为整数单位(如价格存分为单位,
3.7 元 → 370 分) - 调试时可用
var_export($arr, true)查看实际键值,但它显示的仍是转换后的整数
注意:字符串形式的浮点数不会被转换
如果键是字符串,哪怕内容是浮点数(如 "3.7"),PHP 会原样保留:
$arr = ["3.7" => 'a', "0.0" => 'b']; print_r(array_keys($arr)); // 输出:Array ( [0] => 3.7 [1] => 0.0 ) —— 这里是字符串,不是 float
此时 array_keys() 返回字符串键,和浮点数键的隐式转换无关。



















