在 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(),而不必担心数字键被误处理啦!