PHP数组键名仅支持整数和字符串;其他类型会强制转换:布尔转0/1、浮点截断、数字字符串转整数(如"123"→123)、"08"等非法格式保留为字符串、null转空字符串;数组/对象作键则报Illegal offset type错误。

PHP 数组键名只允许两种类型:整数(int)和字符串(string)。其他类型作为键名时,PHP 会强制转换;若无法合理转换(如数组、对象),则直接报错。
合法键名类型及行为
整数键和字符串键是唯一被原生支持的键类型。PHP 不区分“索引数组”和“关联数组”,底层统一用哈希表实现,所以两者可共存于同一数组中:
-
整数键:如
$arr[0]、$arr[100],用于顺序访问或自动索引递增 -
字符串键:如
$arr['name']、$arr['user_id'],语义清晰,适合结构化数据
非法键名的隐式转换规则
当使用布尔值、浮点数、NULL 或数字字符串等类型作键时,PHP 按固定规则转为 int 或 string:
-
布尔值:
true→1,false→0 -
浮点数:小数部分直接截断,
3.9→3,1.0→1 -
数字字符串:形如
"123"、"-5"的合法十进制字符串 → 转为对应整数;但"08"、"1e2"不合法,保留为字符串 -
NULL → 空字符串
"" -
资源、数组、对象:不支持转换,运行时报致命错误
Fatal error: Illegal offset type
转换引发的覆盖问题
多个不同原始类型的键可能转成同一个整数,导致后赋值覆盖先赋值:
立即学习“PHP免费学习笔记(深入)”;
$arr["1"] = 'a';$arr[1] = 'b';$arr[1.0] = 'c';$arr[true] = 'd';
最终数组只有一个键 1,值为 'd'。这种覆盖静默发生,不易察觉,容易引发逻辑错误。
如何安全检查键是否存在
注意 isset() 和 array_key_exists() 行为不同:
-
isset($arr['email'])返回false若$arr['email'] === null,即它不区分“键不存在”和“键存在但值为 null” -
array_key_exists('email', $arr)只判断键是否在数组中,哪怕对应值是null也返回true
需要精确判断键存在性时,优先用 array_key_exists()。



















