php中在树状数据结构中获取从子级节点到根节点的所有节点数据

前言

在处理树状结构数据中,有时候需要查询从子级节点到根节点的所有节点数据。例如:

$tree = [
    [
        "id" => 1,
        "pid" => 0,
        "title" => "湖北省",
        "children" => [
            [
                "id" => 2,
                "pid" => 1,
                "title" => "武汉市",
                "children" => [
                    [
                        "id" => 3,
                        "pid" => 2,
                        "title" => "武昌区",
                        "children" => [
                            [
                                "id" => 4,
                                "pid" => 3,
                                "title" => "蛇山西山坡特1号",
                                "children" => [
                                    [
                                        "id" => 5,
                                        "pid" => 4,
                                        "title" => "黄鹤楼",
                                    ],
                                ],
                            ],
                        ],
                    ],
                    [
                        "id" => 6,
                        "pid" => 2,
                        "title" => "蔡甸区",
                        "children" => [
                            [
                                "id" => 7,
                                "pid" => 6,
                                "title" => "新天大道288号",
                                "children" => [
                                    [
                                        "id" => 8,
                                        "pid" => 7,
                                        "title" => "华中科技大学同济医院",
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
];

现在要获取id等于5的节点到根节点的所有节点数据,这时候就需要用到递归循环查询当前的节点的父级节点一直到根节点的所有数据。

解决方法

这里分享一种非常好用的方法,可以查询父级节点中的任意的值。

//由子节点获取所有父级节点数据
function getFatherNode($data, $target)
{
    // 具体代码逻辑
    $result = [];
    return get_father_path($data, $target, $result) ? $result : [];
}

function get_father_path($tree, $target, &$result)
{
    foreach ($tree as $item) {
        $result[] = $item['id'] . $item['title'];//这里是id拼接title,可以随意更改查询结果。
        if ($item['id'] === $target) {
            return true;
        }
        if (isset($item['children']) && get_father_path($item['children'], $target, $result)) {
            return true;
        }
        array_pop($result);
    }
    return false;
}
//使用方法,直接调用该方法并且传递树结构数据和当前要查询的节点id。
$data = getFatherNode($tree, 8);
var_dump($data);

结果演示:

$result = [
    "1湖北省",
    "2武汉市",
    "6蔡甸区",
    "7新天大道288号",
    "8华中科技大学同济医院",
];
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值