← PHP中的asort()函数:按值升序排序并保持键值关联 PHP中的array_column():从二维数组里抽一列出来 →

PHP中的array_change_key_case():批量转换数组键名大小写

原创 2026-05-22 PHP 已有人查阅

写代码有时候会遇到这种情况:从不同地方拿到的数组,键名有的是大写开头、有的是小写、有的是全大写。比较或者合并的时候就麻烦了,因为PHP里键名是区分大小写的。

array_change_key_case()就是解决这个问题的——它能一次性把数组里所有键名转成全小写或者全大写。

语法格式

array_change_key_case(array $array, int $case = CASE_LOWER): array

参数说明:

参数 说明 是否必填
array 要处理的数组 必填
case 转换目标:CASE_UPPER或CASE_LOWER 可选

返回值: 返回键名转换后的新数组。原数组不变。

注意:第二个参数省略时,默认转成小写(CASE_LOWER)。

核心要点

这个函数表面简单,实际有几个细节值得注意:

  1. 只影响键名,不影响值 - 值里面的内容不变

  2. 返回新数组 - 原数组不会被修改,这点和sort()、asort()那些不一样

  3. 大小写转换只针对字母 - 数字、下划线、特殊符号保持不变

  4. 键名冲突时后面的覆盖前面的 - 这个容易踩坑,下面示例会说

示例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
)

注意下划线、数字这些字符保持不变,只会改字母。

个人经验分享

  1. 什么时候用CASE_UPPER? 场景少一些,主要是做数据映射、配置输出时统一格式。个人90%的情况用CASE_LOWER,因为PHP数组键名习惯用小写加下划线。

  2. 为什么不用strtolower自己循环? 可以,但代码号学习编程时建议用内置函数。array_change_key_case()内部用C语言实现,处理大数组时效率比自己foreach循环高不少。

  3. 键名冲突的避免策略:

    • 转换前先检查是否存在大小写不同的相同键名

    • 如果确定有冲突,手动处理而不是依赖函数默认行为

    • 或者转换前给键名加前缀/后缀区分

  4. 这函数不递归处理多维数组 - 只处理第一层键名。多维数组里面嵌套的数组键名不会变,需要注意这点。

本节课程知识要点

  • array_change_key_case()转换数组所有键名为全大/小写

  • 第二个参数省略时默认转小写(CASE_LOWER)

  • 返回新数组,原数组保持不变

  • 转之后出现重复键名,后面的值覆盖前面的

  • 只处理顶层键名,不递归

  • 数字和下划线等非字母字符不变

← PHP中的asort()函数:按值升序排序并保持键值关联 PHP中的array_column():从二维数组里抽一列出来 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号