在日常开发中,我们经常会从第三方接口获取 JSON 数据,然而这些接口返回的数据中键名的大小写格式不一致,有些是大写开头、有些是全大写或全小写。这种不统一的键名格式会在后续处理数据时带来不少麻烦,比如字段提取、统一映射、数组转对象等环节都可能出错或变得冗长。
幸运的是,PHP 提供了一个非常实用的函数:array_change_key_case(),它可以帮助我们优雅而高效地统一数组中的键名大小写,从而解决这一问题。
array_change_key_case() 是 PHP 的一个内置函数,作用是将数组中所有键名的大小写统一转换成小写或大写。
array_change_key_case(array $array, int $case = CASE_LOWER): array
$array:需要处理的关联数组;
$case:转换目标大小写类型,CASE_LOWER(默认)表示转换为小写,CASE_UPPER 表示转换为大写。
我们以一个真实的 JSON 字符串为例,演示如何优雅地统一键名大小写。
{
"UserID": 101,
"UserName": "Alice",
"Email": "alice@example.com"
}
可以看到,键名是大小写混合的。在处理时,为了方便,我们希望全部转换为小写键名。
<?php
// 假设这是从接口 https://api.m66.net/user 获取的数据
$json = '{
"UserID": 101,
"UserName": "Alice",
"Email": "alice@example.com"
}';
// 第一步:将 JSON 转为关联数组
$data = json_decode($json, true);
// 第二步:使用 array_change_key_case() 将键名统一转为小写
$normalized = array_change_key_case($data, CASE_LOWER);
// 输出处理后的数组
print_r($normalized);
/*
输出结果:
Array
(
[userid] => 101
[username] => Alice
[email] => alice@example.com
)
*/
?>
通过这种方式,我们就可以放心地用 $normalized['username'] 等方式取值,而不用担心键名的大小写不一致带来的问题。
如果 JSON 是多层嵌套结构,单纯使用 array_change_key_case() 只能处理第一层,我们需要封装一个递归函数来处理所有层级:
function array_keys_to_lower_recursive(array $array): array {
$result = [];
foreach ($array as $key => $value) {
$key = is_string($key) ? strtolower($key) : $key;
$result[$key] = is_array($value) ? array_keys_to_lower_recursive($value) : $value;
}
return $result;
}
使用方式和上面类似:
$normalized = array_keys_to_lower_recursive($data);
当你处理 JSON 数据并希望统一键名大小写时,array_change_key_case() 是一个既简单又高效的工具。配合递归版本,还能处理更复杂的数据结构。这样不仅提高了代码的可读性,也降低了维护成本。