在使用 GraphQL API 获取数据时,我们常常会处理结构复杂的嵌套数组。由于 GraphQL 并不限制字段名的大小写风格(如 camelCase、snake_case 等),返回的数据中可能混合了不同格式的键名。如果你想在 PHP 中统一这些键名的大小写,array_change_key_case() 是一个非常实用的函数。
本文将介绍如何在处理 GraphQL API 返回的数据时,结合递归逻辑使用 array_change_key_case() 函数,实现键名统一为小写或大写的效果。
array_change_key_case() 是 PHP 内置函数,用于将数组的所有键名转换为小写或大写。
array_change_key_case(array $array, int $case = CASE_LOWER): array
$case 可选参数:
CASE_LOWER:默认,转为小写
CASE_UPPER:转为大写
假设你通过以下 URL 请求 GraphQL 接口,获取某文章列表:
$url = 'https://m66.net/graphql';
请求返回的 JSON 数据如下:
{
"data": {
"ArticleList": [
{
"ID": 101,
"Title": "PHP Array Tricks",
"Author": {
"Name": "John Doe",
"Email": "john@example.com"
}
}
]
}
}
你可以看到其中包含嵌套的对象数组,键名格式不一致。
array_change_key_case() 本身并不支持多维数组,因此我们需要封装一个递归函数来处理嵌套结构:
function change_keys_case_recursive(array $array, int $case = CASE_LOWER): array {
$result = [];
foreach ($array as $key => $value) {
$newKey = ($case === CASE_UPPER) ? strtoupper($key) : strtolower($key);
if (is_array($value)) {
$result[$newKey] = change_keys_case_recursive($value, $case);
} else {
$result[$newKey] = $value;
}
}
return $result;
}
<?php
// 模拟从 GraphQL 接口获取 JSON 数据
$json = '{
"data": {
"ArticleList": [
{
"ID": 101,
"Title": "PHP Array Tricks",
"Author": {
"Name": "John Doe",
"Email": "john@example.com"
}
}
]
}
}';
$data = json_decode($json, true);
// 调用自定义函数统一键名为小写
$normalizedData = change_keys_case_recursive($data, CASE_LOWER);
// 输出结果
print_r($normalizedData);
function change_keys_case_recursive(array $array, int $case = CASE_LOWER): array {
$result = [];
foreach ($array as $key => $value) {
$newKey = ($case === CASE_UPPER) ? strtoupper($key) : strtolower($key);
if (is_array($value)) {
$result[$newKey] = change_keys_case_recursive($value, $case);
} else {
$result[$newKey] = $value;
}
}
return $result;
}
?>
Array
(
[data] => Array
(
[articlelist] => Array
(
[0] => Array
(
[id] => 101
[title] => PHP Array Tricks
[author] => Array
(
[name] => John Doe
[email] => john@example.com
)
)
)
)
)
如你所见,所有键名都被统一转为小写,更利于后续的数据处理与模板渲染。
在处理 GraphQL API 返回的数据时,结合 array_change_key_case() 与递归逻辑,可以轻松实现键名大小写统一。这样的规范化处理不仅提升代码可读性,还能避免因为大小写不一致带来的潜在 Bug。你可以根据项目需要选择将键名转换为小写或大写,灵活调整。