php数组键仅支持整型和字符串型,其他类型会自动转换:浮点数截断、布尔转0/1、null转空字符串,数组或对象键报错;字符串数字键与整型键冲突;值可为任意类型。

PHP 数组的键和值可以是多种类型,但实际存储时会遵循明确的转换规则——尤其是键(key)部分,PHP 仅支持 整型 和 字符串型 作为合法键名,其他类型会被自动转换;而值(value)则无此限制,可为任意类型(包括 null、resource、object、array 等)。
数组键的类型限制与隐式转换
当你用非整型、非字符串类型作为键时,PHP 会立即进行类型转换:
-
浮点数键:如
[3.7 => 'a'],会被截断为整数3;[3.0 => 'b']转为3,与前者冲突,后者覆盖前者。 -
布尔键:
[true => 'x']→ 键变为1;[false => 'y']→ 键变为0。 -
null 键:
[null => 'z']→ 转为''(空字符串)。 -
数组或对象键:直接报致命错误
Fatal error: Illegal offset type,不允许使用。
字符串键的数字特征处理
PHP 会对字符串键做“数字识别”:如果字符串看起来像十进制整数(如 "123"、"-45"、"0123"),它会被当作整型键处理(注意:"0123" 是十进制 123,不是八进制);但带前导零且含非数字字符(如 "0123abc")或含小数点(如 "12.3")则保留为字符串键。
这意味着:['123' => 'A', 123 => 'B'] 实际只保留一个元素,后写入的 123 => 'B' 会覆盖 '123' => 'A'。
立即学习“PHP免费学习笔记(深入)”;
值的类型自由性与注意事项
值可为任意类型,包括另一个数组(构成多维数组)、对象、闭包、资源等。但需注意:
- 资源(resource)类型值在资源关闭后仍保留在数组中,但访问其内容会出错。
- 对象作为值时,存的是对象引用(PHP 7.4+ 默认行为),修改原对象会影响数组中的值(除非显式克隆)。
- 函数或闭包可作为值安全存储,调用时需加括号,如
$arr['fn']()。
判断键是否存在应使用严格方式
由于自动转换的存在,用 isset($arr[123]) 或 array_key_exists('123', $arr) 可能得出不同结果。推荐:
- 检查整型键是否存在 → 用
array_key_exists(123, $arr) - 检查字符串键是否存在(尤其含数字外观)→ 显式传入字符串,如
array_key_exists('123', $arr) - 避免用
isset($arr['123'])判断字符串键,因为它可能触发整型转换逻辑,导致误判。










