
本文介绍如何将包含城市与州信息的 JSON 数组,转换为以州缩写为键、对应城市数组为值的嵌套关联数组,解决 array_combine 无法处理重复键的问题。
本文介绍如何将包含城市与州信息的 json 数组,转换为以州缩写为键、对应城市数组为值的嵌套关联数组,解决 `array_combine` 无法处理重复键的问题。
在实际开发中,我们常需对 JSON 格式的地理数据进行结构重组。例如,原始数据是一个城市对象数组,每个对象含 "CITY" 和 "STATE" 字段;而业务需求往往要求按州聚合城市列表(如生成下拉联动菜单、统计各州城市数量等)。此时若直接使用 array_column + array_combine,会因州代码(如 "TX")重复导致后项覆盖前项——仅保留最后一个城市,无法满足多城市归组需求。
正确做法是手动遍历并累积构建:初始化一个空数组,逐个解析 JSON 对象,以 STATE 值作为主键,利用 PHP 的动态数组语法 $result[$state][] = $city 将城市追加到对应州的子数组中。该语法天然支持重复键的累加操作,无需预先判断键是否存在。
以下是完整可运行示例:
<?php $json_string = '[
{"CITY": "Horseheads", "STATE": "NY"},
{"CITY": "Auburn", "STATE": "AL"},
{"CITY": "Hurst", "STATE": "TX"},
{"CITY": "Mesquite", "STATE": "TX"},
{"CITY": "Arlington", "STATE": "TX"}
]';
// 解析 JSON 字符串为 PHP 关联数组(推荐设第二个参数为 true)
$data = json_decode($json_string, true);
// 初始化结果数组
$grouped = [];
// 遍历每条记录,按 STATE 分组累积 CITY
foreach ($data as $item) {
$state = $item['STATE'] ?? '';
$city = $item['CITY'] ?? '';
// 安全检查:跳过缺失关键字段的无效项
if (empty($state) || empty($city)) {
continue;
}
// 动态追加城市到对应州的数组中
$grouped[$state][] = $city;
}
print_r($grouped);
?>
输出结果:
Array
(
[NY] => Array
(
[0] => Horseheads
)
[AL] => Array
(
[0] => Auburn
)
[TX] => Array
(
[0] => Hurst
[1] => Mesquite
[2] => Arlington
)
)
✅ 关键要点总结:
- 使用 json_decode($json, true) 显式返回关联数组(而非默认的对象),便于用 [] 语法访问字段;
- [] 追加语法是核心技巧:$grouped[$state][] = $city 等价于 array_push($grouped[$state], $city),且自动初始化子数组;
- 添加字段存在性校验(?? '' 和 empty())可提升代码健壮性,避免 Notice 错误;
- 若需保持原始顺序或进一步排序(如按州名字母序),可在循环后使用 ksort($grouped) 或 uasort() 处理。
此方法简洁高效,时间复杂度为 O(n),适用于数千条以内数据;对于超大规模数据,可结合生成器或数据库聚合优化,但本场景下原生 PHP 循环已是最佳实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











