前言
在处理树状结构数据中,有时候需要查询从子级节点到根节点的所有节点数据。例如:
$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华中科技大学同济医院",
];