如何为多维嵌套数组中的每个子元素自动添加 parent_id 字段
技术百科
碧海醫心
发布时间:2026-01-15
浏览: 次 本文介绍一种递归方式,为 php 中任意深度的嵌套数组(如树形结构)中每个非根节点自动注入 parent_id 字段,值为其直接父节点的 uuid,适用于权限菜单、分类目录等场景。
在处理树状数据结构(如组织架构、导航菜单、商品类目)时,常需将扁平的父子关系显式标注到每个子节点中。原始数据通常只包含 uuid 和 childrens 数组,但下游逻辑(如前端渲染、数据库写入或权限校验)往往依赖 parent_id 字段快速定位归属。此时,需对整个嵌套结构进行深度优先遍历,为每个子元素动态添加 parent_id。
以下是一个健壮、可复用的 PHP 实现方案:
/**
* 递归为嵌套对象数组添加 parent_id 字段
* @param array|object $childrens 子节点集合(引用传参以支持修改)
* @param mixed $parentId 父节点的 uuid 值
* @return void
*/
function addParentId(&$childrens, $parentId): void {
if (empty($childrens)) {
return;
}
foreach ($childrens as &$child) {
// 为当前子节点添加 parent_id
$child->parent_id = $parentId;
// 若存在后代节点,递归处理,将当前节点的 uuid 作为下一层的 parent_id
if (isset($child->childrens) && is_array($child->childrens) && !empty($child->childrens)) {
addParentId($child->childrens, $child->uuid);
}
}
}
// 示例:解析 JSON 数据并处理
$json = '{"array": [{ "uuid": 7, "nome": "Parent", "ativo": 1, "childrens": [{ "uuid": 9, "nome": "Child", "ativo": 1, "childrens": [{ "uuid": 70, "nome": "Child of Child", "ativo": 1, "childrens": [{ "uuid": 391, "nome": "Child of Child of Child", "ativo": 1, "childrens": [] }] }] }] }]}';
$data = json_decode($json);
// 遍历顶层节点,为其 childrens 注入 parent_id
foreach ($data->array as &$node) {
if (!empty($node->childrens)) {
addParentId($node->childrens, $node->uuid);
}
}
echo json_encode(
$data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);✅ 关键要点说明:
- 使用 &$childrens 引用传参,确保原对象被直接修改,避免复制开销;
- 函数严格检查 childrens 是否存在且非空,增强鲁棒性;
- 支持任意嵌套层级,无需预设深度;
- parent_id 仅添加于子节点(即 childrens 中的元素),根节点(如 uuid: 7)本身不设 parent_id,符合语义规范。
⚠️ 注意事项:
- 输入数据必须为 stdClass 对象(json_decode 默认行为),若使用关联数组(json_decode($json, true)),需将代码中 -> 改为 [''],并调整递归调用逻辑;
- 若原始数据含 null 或非对象类型的 childrens,建议增加类型校验(如 is_object($child));
- 大型深层结构*意 PHP 递归限制(xdebug.max_nesting_level),必要时可改用栈模拟迭代实现。
该方案简洁高效,一次调用即可完成整棵树的 parent_id 注入,是构建可扩展树形数据服务的基础工具。
# 是一个
# 适用于
# 为其
# 数据结构
# 工具
# js
# json
# 递归
# 对象
# 值为
# 数据库
# 架构
# 栈
# node
# NULL
# 前端
# php
# 树状
# 遍历
# 是否存在
# 原始数据
# 关联数组
相关栏目:
<?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; ?>
】
相关推荐
- Windows怎样拦截QQ浏览器广告_Window
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win11怎么连接投影仪_Win11多显示器投屏设
- php怎么下载安装并配置环境变量_命令行调用PHP
- Windows10系统服务优化指南_Win10禁用
- php转exe用什么工具打包快_高效打包软件推荐【
- c# await 一个已经完成的Task会发生什么
- Win10怎么卸载剪映_Win10彻底卸载剪映方法
- Win10怎样安装PPT模板_Win10安装PPT
- Windows如何查看和管理已安装的字体?(字体文
- c++的mutex和lock_guard如何使用
- 如何用::实现工具类方法调用_php静态工具类设计
- Python文件和流处理指南_高效读写大体积数据文
- Go 中 := 短变量声明的类型推导机制详解
- Python 模块的 __name__ 属性如何由
- 如何在Windows上设置闹钟和计时器_系统自带的
- Win11笔记本怎么看电池健康度_Win11电池报
- 如何在 Go 中高效缓存与分发网络视频流
- 如何使用Golang开发简单的聊天室消息存储_Go
- 如何使用Golang sync.Map实现并发安全
- Win11怎么关闭应用权限_Windows11相机
- c++ stringstream用法详解_c++字
- Win11怎么关闭任务栏小组件_Windows11
- Golang如何测试HTTP中间件_Golang
- 如何在Golang中处理数据库事务错误_回滚和日志
- Win11怎么更改电脑名称_Windows 11修
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Windows怎样关闭锁屏广告_Windows关闭
- Mac上的iMovie如何剪辑视频?(新手入门教程
- php怎么操作Redis_Redis扩展连接与基本
- 如何在 Go 结构体中正确初始化 map 字段
- Win11如何连接Xbox手柄 Win11蓝牙连接
- Windows10如何查看保存的WiFi密码_Wi
- Windows怎样关闭开始菜单广告_Windows
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- php8.4如何实现队列任务_php8.4redi
- 如何使用Golang defer优化性能_减少不必
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Win11怎么设置屏保时间_调整Win11屏幕保护
- 如何正确访问 Laravel 模型或对象的属性而非
- 如何在Golang中操作嵌套切片指针_Golang
- Bpmn 2.0的XML文件怎么画流程图
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11怎么关闭自动调节屏幕亮度_Windows
- Python对象生命周期管理_创建销毁解析【教程】
- How to Properly Use NumPy
- PhpStorm怎么调试PHP代码_PhpStor
- Python安全爬虫设计_IP代理池与验证码识别策
- Win10怎么关闭自动更新错误重启 Win10策略


QQ客服