如何基于关联字段(如国家)提取嵌套唯一数据结构
技术百科
碧海醫心
发布时间:2025-12-25
浏览: 次 本文介绍如何从数据库查询返回的对象数组中,按指定字段(如 country)分组并构建多级嵌套结构,实现“国家 → 省份 → 城市”的层级化去重与关联组织。
在实际 Web 开发中,常需将扁平的数据库结果(如 country, province, city)转换为具有逻辑层级关系的数据结构,便于模板渲染或 API 响应。关键不在于简单去重(如 array_unique),而是在保留原始关联的前提下,按主键字段(如 'country')聚合子维度('province' 和 'city')。
最直接、高效且可读性强的方式是使用 嵌套关联数组 进行一次遍历构建:
$result = []; foreach ($db_data as $item) { $country = $item->country; $province = $item->province; $city = $item->city; // 自动创建多级键:$result['Canada']['Ontario']['Toronto'] = $item $result[$country][$province][$city] = $item; }
该方案天然支持重复值覆盖(若同一城市出现多次,后者覆盖前者),且完全保留原始对象的所有属性(如 living_cost),后续可随时扩展访问。例如:
// 获取加拿大安大略省的所有城市名
$citiesInOntario = array_keys($result['Canada']['Ontario'] ?? []);
// 遍历所有国家及其省份
foreach ($result as $country => $provinces) {
echo "- {$country}\n";
foreach ($provinces as $province => $cities) {
echo " - {$province}\n";
foreach (array_keys($cities) as $city) {
echo " - {$city}\n";
}
}
}✅ 优势说明:
- 零依赖:仅用原生 PHP 数组语法,无需额外函数或扩展;
- 高性能:O(n) 时间复杂度,单次遍历完*部分组;
- 强关联性:每个城市仍绑定其原始对象,可安全访问 living_cost 等任意字段;
- 自动去重:同名城市在同一省份下仅保留一份(键名唯一),符合“逻辑唯一”需求。
⚠️ 注意事项:
- 若需严格保留重复城市(如不同时间戳记录),请改用 [] 追加($result[$country][$province][] = $item;);
- 字段名需确保存在且非 null,建议在循环内添加 isset() 或 !empty() 校验以增强健壮性;
- 输出前可用 ksort() 对国家/省份键排序,提升可读性(如 ksort($result); foreach ($result as $country => $provinces) { ksort($provinces); ... })。
此方法兼顾简洁性与工程实用性,是处理层级化地理数据、分类标签、多维统计等场景的经典实践。
# 是在
# 多维
# 绑定
# 数据结构
# 加拿大
# 循环
# 对象
# cos
# 数据库
# NULL
# foreach
# php
# 高性能
# 遍历
# 转换为
# 关联数组
# ksort
# 仅用
# 如不
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac版Final Cut Pro入门_Mac视频
- 如何使用Golang搭建本地API测试环境_快速验
- Win11怎么设置应用分屏_Windows11贴靠
- 手机php怎么转mp4_手机端php文件转mp4a
- 如何快速验证Golang安装是否成功_运行go v
- c++怎么用jemalloc c++替换默认内存分
- Python抽象类与接口设计_规范说明【指导】
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Win11怎么设置ipv4地址_Windows 1
- Win11局域网共享怎么设置 Win11文件夹网络
- Windows10系统怎么查看防火墙状态_Win1
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- PowerShell怎么创建复杂的XML结构
- php中::能访问全局变量吗_全局作用域与类作用域
- Win11麦克风没声音怎么设置_Win11麦克风权
- Win11怎么设置右键刷新选项_Windows11
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Linux如何使用Curl发送请求_Linux下A
- c# 在高并发下使用反射发射(Reflection
- PHP cURL GET请求:正确设置请求头与身份
- Windows10电脑怎么设置电源按钮_Win10
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- 一文教你快速开通网站LOGO图
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- Win11如何关闭游戏模式 Win11禁用Xbox
- Win11关机快捷键是什么_Win11快速关机方法
- Win10系统怎么查看网络连接状态_Windows
- Win10怎么限制单程序CPU占用上限_Win10
- 如何在 Pandas 中按元素交集合并两列字符串
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win10如何更改开机密码_Windows10登录
- Windows 11无法安全删除U盘提示设备正在使
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11 explorer.exe频繁崩溃_修复
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Win11怎么设置任务栏对齐方式_Windows1
- Windows10怎么备份注册表_Windows1
- php订单日志怎么按金额排序_php按订单金额排序
- Win11应用商店下载慢怎么办 Win11更改DN
- 如何使用Golang管理跨项目依赖_Golang多
- Python性能剖析高级教程_cProfileLi
- C#如何序列化对象为XML XmlSerializ
- LINUX如何开放防火墙端口_Linux fire
- windows如何备份注册表_windows导出和
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11怎么开启专注模式_Windows11时钟
- Win11声音忽大忽小怎么办 Win11音频增强功
- Win11怎么关闭贴靠布局_Win11禁用窗口最大

reach ($db_data as $item) {
$country = $item->country;
$province = $item->province;
$city = $item->city;
// 自动创建多级键:$result['Canada']['Ontario']['Toronto'] = $item
$result[$country][$province][$city] = $item;
}
QQ客服