当前位置: 首页> 最新文章列表> array_change_key_case() 是否会改变数组中数字键的大小写?

array_change_key_case() 是否会改变数组中数字键的大小写?

M66 2025-05-12

在 PHP 中,处理数组时经常会遇到键名(key)大小写转换的需求,尤其是处理从外部来源(如表单、API 返回等)获取到的关联数组数据时。array_change_key_case() 就是一个用来统一数组键名大小写的函数。然而,一个经常被忽略但又颇为关键的问题是:

array_change_key_case() 是否会改变数组中“数字键”的大小写?

答案是:不会

官方文档解释

根据 PHP 官方文档array_change_key_case() 的作用是:

返回其所有键都被转换为大写或小写的数组。

但这仅适用于字符串类型的键,对于数字键,该函数不会进行任何修改。

示例说明

下面是一个例子来演示它的实际行为:

<?php
$data = [
    "Name" => "Alice",
    "EMAIL" => "alice@example.com",
    100 => "编号",
    "AGE" => 30
];

$result = array_change_key_case($data, CASE_LOWER);

print_r($result);
?>

输出结果:

Array
(
    [name] => Alice
    [email] => alice@example.com
    [100] => 编号
    [age] => 30
)

可以看到:

  • 所有字符串键(如 "Name""EMAIL""AGE")被成功转换成了小写;

  • 而数字键 100 保持不变,既没有变成字符串,也没有改变大小写。

为什么数字键不会变?

这是因为数字在 PHP 中是无大小写之分的。PHP 中数组的键可以是字符串或整数(整型)。而大小写转换本质上只对字符串有效。因此,array_change_key_case() 只会处理键为字符串的元素。

实际应用场景举例

如果你通过 API 请求返回了一组数组数据,想统一处理键名,可以使用此函数。但在处理过程中,你无需担心数字索引的键被错误地转换成字符串或发生变化。例如:

<?php
$json = '{
    "UserID": 101,
    "Username": "bob",
    "Scores": {
        "0": 90,
        "1": 85,
        "2": 88
    }
}';

$data = json_decode($json, true);
$data = array_change_key_case($data, CASE_LOWER);

// 输出 JSON 结构到前端
echo json_encode($data);
?>

前端依然可以使用 .scores[0] 这样的方式访问数据,不受影响。

如果你需要进一步处理数组中的嵌套结构(如递归地将所有层级的键名转为小写),可以封装一个递归函数,但依旧不需要担心数字键:

function array_change_key_case_recursive($arr, $case = CASE_LOWER) {
    return array_map(function ($item) use ($case) {
        if (is_array($item)) {
            return array_change_key_case_recursive($item, $case);
        }
        return $item;
    }, array_change_key_case($arr, $case));
}

小结

  • ? array_change_key_case() 只对字符串键有效;

  • ? 它不会修改数组中的数字键

  • ?? 数字键在 PHP 中是严格的整型,不存在大小写之说;

  • ?? 若需递归处理嵌套数组,需手动封装递归函数处理字符串键。

这样就可以在开发中安心使用 array_change_key_case(),而不必担心数字键被误处理啦!