php数组键名严格区分大小写,源于hashtable哈希函数对字节序列的逐位运算,“name”与“name”生成不同哈希值而被视为独立键;字符串键不作大小写折叠或unicode标准化,'user'、'user'、'user'可共存;数字键无大小写概念,但字符串数字键(如'123')会转为整数导致覆盖;isset和array_key_exists均要求字面量完全匹配;大小写不敏感查找需手动统一键名大小写或遍历比对。

PHP 从 7.0 到 8.x(包括假设的 PHP 7.5)数组键名严格区分大小写,这是由其底层哈希表实现决定的,不是语法约定,而是引擎行为。
键名大小写敏感是哈希计算的结果
PHP 数组底层基于 HashTable,每个字符串键在插入前会经过哈希函数处理(如 zend_string_hash_func),该函数对字节逐位运算。"Name" 和 "name" 是两个不同的字节序列,生成的哈希值不同,最终被映射到不同桶(Bucket)中,因此被视为完全独立的键。
$arr = ['Name' => 'A', 'name' => 'B']; var_dump($arr['Name'], $arr['name']); // 输出: string(1) "A" 和 string(1) "B"
字符串键不参与类型转换或归一化
PHP 不会对键做大小写折叠(如 strtolower())、Unicode 标准化或 ASCII 忽略大小写处理。哪怕键是纯英文字母,"ID"、"id"、"Id" 都是三个互不覆盖的键。
- ✅
'User'、'user'、'USER'可共存于同一数组 - ❌ 不存在类似
array_key_exists('key', $arr, true)的大小写不敏感选项
数字键不受影响,但注意隐式转换
整数键(如 123)本身无大小写概念;但字符串数字键(如 '123')会被自动转为整数 123,此时大小写不适用——因为 '123' 和 '123' 本就是相同字面量。真正要注意的是:
$arr['123'] = 'str'; $arr[123] = 'int'; // 实际与上一行共用同一个键(整数123),后者覆盖前者
这不是大小写问题,而是字符串数字键 → 整数键的强制类型转换。
检查键存在时必须大小写完全匹配
isset($arr['Key']) 和 array_key_exists('Key', $arr) 都要求字面量完全一致:
$arr = ['KEY' => 'yes'];
var_dump(isset($arr['key'])); // bool(false)
var_dump(array_key_exists('key', $arr)); // bool(false)
如需大小写不敏感查找,需手动处理
没有内置函数支持,常见做法是预处理键名:
- 统一转小写存入新数组(适合只读场景)
- 遍历
array_keys($arr)并用strcasecmp()匹配(性能较低,慎用于大数组) - 使用
array_change_key_case($arr, CASE_LOWER)创建副本后查键
$lowerKeys = array_change_key_case($arr, CASE_LOWER); $value = $lowerKeys['username'] ?? null; // 前提是原数组有 'username' 或 'USERNAME' 等
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











