写代码有时候会遇到这种情况:从不同地方拿到的数组,键名有的是大写开头、有的是小写、有的是全大写。比较或者合并的时候就麻烦了,因为PHP里键名是区分大小写的。
array_change_key_case()就是解决这个问题的——它能一次性把数组里所有键名转成全小写或者全大写。
语法格式
array_change_key_case(array $array, int $case = CASE_LOWER): array
参数说明:
| 参数 | 说明 | 是否必填 |
|---|---|---|
| array | 要处理的数组 | 必填 |
| case | 转换目标:CASE_UPPER或CASE_LOWER | 可选 |
返回值: 返回键名转换后的新数组。原数组不变。
注意:第二个参数省略时,默认转成小写(CASE_LOWER)。
核心要点
这个函数表面简单,实际有几个细节值得注意:
-
只影响键名,不影响值 - 值里面的内容不变
-
返回新数组 - 原数组不会被修改,这点和sort()、asort()那些不一样
-
大小写转换只针对字母 - 数字、下划线、特殊符号保持不变
-
键名冲突时后面的覆盖前面的 - 这个容易踩坑,下面示例会说
示例1:转全大写
<?php
$student = array(
"name" => "张三",
"age" => 20,
"class" => "软件工程"
);
$result = array_change_key_case($student, CASE_UPPER);
print_r($result);
?>
输出:
Array
(
[NAME] => 张三
[AGE] => 20
[CLASS] => 软件工程
)
键名从name/age/class变成了NAME/AGE/CLASS。
示例2:转全小写(默认行为)
<?php
$config = array(
"DB_HOST" => "localhost",
"DB_USER" => "root",
"DB_PASS" => "123456"
);
$result = array_change_key_case($config); // 没传第二个参数,默认小写
print_r($result);
?>
输出:
Array
(
[db_host] => localhost
[db_user] => root
[db_pass] => 123456
)
代码号学习编程时经常遇到配置文件用大写常量风格,但后续处理需要小写键名,这个函数就派上用场了。
示例3:键名冲突的情况(重要!)
这是最容易出问题的地方:
<?php
$data = array(
"ID" => 1001,
"id" => 2002,
"Id" => 3003
);
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
?>
输出:
Array
(
[id] => 3003
)
三个键(ID、id、Id)转成小写后都变成了"id"。PHP处理时,先遇到ID -> 存到[id]=1001,然后遇到id -> 覆盖成[id]=2002,之后遇到Id -> 再覆盖成[id]=3003。最终只保留了之后一个。
我早期踩过这个坑,合并几个API返回的数据时发现有些数据莫名失踪了,查了半天才发现是键名大小写不同导致的覆盖。建议使用这个函数前,先用array_keys($array)检查一下键名有没有大小写冲突的可能。
示例4:混合大小写转小写
<?php
$product = array(
"ProductName" => "机械键盘",
"productPrice" => 299,
"PRODUCT_STOCK" => 50,
"product_SKU" => "KB-001"
);
$result = array_change_key_case($product, CASE_LOWER);
print_r($result);
?>
输出:
Array
(
[productname] => 机械键盘
[productprice] => 299
[product_stock] => 50
[product_sku] => KB-001
)
注意下划线、数字这些字符保持不变,只会改字母。
个人经验分享
-
什么时候用CASE_UPPER? 场景少一些,主要是做数据映射、配置输出时统一格式。个人90%的情况用CASE_LOWER,因为PHP数组键名习惯用小写加下划线。
-
为什么不用strtolower自己循环? 可以,但代码号学习编程时建议用内置函数。
array_change_key_case()内部用C语言实现,处理大数组时效率比自己foreach循环高不少。 -
键名冲突的避免策略:
-
转换前先检查是否存在大小写不同的相同键名
-
如果确定有冲突,手动处理而不是依赖函数默认行为
-
或者转换前给键名加前缀/后缀区分
-
-
这函数不递归处理多维数组 - 只处理第一层键名。多维数组里面嵌套的数组键名不会变,需要注意这点。
本节课程知识要点
-
array_change_key_case()转换数组所有键名为全大/小写 -
第二个参数省略时默认转小写(CASE_LOWER)
-
返回新数组,原数组保持不变
-
转之后出现重复键名,后面的值覆盖前面的
-
只处理顶层键名,不递归
-
数字和下划线等非字母字符不变