
本文介绍一种递归方式,为 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 注入,是构建可扩展树形数据服务的基础工具。










