<?php
$src = '[{"id":"1","name":"媒体(白名单)","pid":"0"},{"id":"2","name":"党媒公共平台","pid":"0"},{"id":"3","name":"政府机构","pid":"0"},{"id":"4","name":"其他","pid":"0"},{"id":"5","name":"中央媒体","pid":"1"},{"id":"6","name":"地方媒体","pid":"1"},{"id":"7","name":"门户媒体","pid":"4"},{"id":"8","name":"综合媒体","pid":"4"},{"id":"9","name":"专业媒体","pid":"4"},{"id":"11","name":"河北省","pid":"6"},{"id":"12","name":"山东省","pid":"6"},{"id":"13","name":"辽宁省","pid":"6"},{"id":"34","name":"北京","pid":"6"},{"id":"45","name":"视频","pid":"9"},{"id":"46","name":"教育","pid":"9"},{"id":"79","name":"法律","pid":"9"},{"id":"80","name":"其他","pid":"9"},{"id":"81","name":"文学","pid":"9"}]';
$result = json_decode($src, true);
$map = array_combine(array_column($result, 'id'), array_column($result, 'pid'));
print_r(getIdAndPid($map, [81]));
/**
* 查出ids中的id以及其父id以及其父id的父id......
* @param $map 以id为键, pid为值的 所有数据 的map
* @param $ids 要查找的ids
* @return array
*/
function getIdAndPid(&$map, $ids){
$res = [];
foreach($ids as $id){
joinPid($map, $id, $res);
}
return array_values(array_unique($res));
}
function joinPid(&$map, $id, &$res){
// 如果其pid不为0, 则继续查找
if(isset($map[$id]) && $map[$id] != 0){
joinPid($map, $map[$id], $res);
}
$res[] = $id;
}
/**
* 查出ids所有子节点, 包含自己
*
* @param $pids 需要查找的ids
* @param $collects 所有id和父类id集合
* @return array
*/
function getAllChild($pids, $result)
{
$map = [];
foreach ($result as $collect) {
$map[] = $collect['pid'] . "_" . $collect['id'];
}
$data = $pids;
foreach ($map as $mix_str) {
$mix = explode('_', $mix_str);
if (in_array($mix[0], $data)) {
$data[] = $mix[1];
}
}
return $data;
}
$src = Array(
array(
"id" => 1,
"name" => "father",
"pid" => 0
),
array(
"id" => 2,
"name" => "father",
"pid" => 0
),
array(
"id" => 3,
"name" => "father",
"pid" => 0
),
array(
"id" => 4,
"name" => "father",
"pid" => 0
),
array(
"id" => 5,
"name" => "son",
"pid" => 1
),
array(
"id" => 6,
"name" => "son",
"pid" => 1
),
array(
"id" => 7,
"name" => "son",
"pid" => 4
),
array(
"id" => 8,
"name" => "son",
"pid" => 4
),
array(
"id" => 9,
"name" => "son",
"pid" => 4
),
array(
"id" => 11,
"name" => "son",
"pid" => 6
),
array(
"id" => 12,
"name" => "son",
"pid" => 6
),
array(
"id" => 13,
"name" => "son",
"pid" => 6
),
array(
"id" => 34,
"name" => "son",
"pid" => 6
),
array(
"id" => 45,
"name" => "son",
"pid" => 9
),
array(
"id" => 46,
"name" => "son",
"pid" => 9
),
array(
"id" => 79,
"name" => "son",
"pid" => 9
),
array(
"id" => 80,
"name" => "son",
"pid" => 9
),
array(
"id" => 81,
"name" => "son",
"pid" => 9
)
);
$result = $src;
echo "<pre>";
print_r(getAllChild([
1,
2
], $result));
获取所有子节点:
$arr = [
1 => [
'id' => 1,
'name' => '父1',
'father' => NULL
],
2 => [
'id' => 2,
'name' => '父2',
'father' => NULL
],
3 => [
'id' => 3,
'name' => '父3',
'father' => NULL
],
4 => [
'id' => 4,
'name' => '儿1-1',
'father' => 1
],
5 => [
'id' => 5,
'name' => '儿1-2',
'father' => 1
],
6 => [
'id' => 6,
'name' => '儿1-3',
'father' => 1
],
7 => [
'id' => 7,
'name' => '儿2-1',
'father' => 2
],
8 => [
'id' => 8,
'name' => '儿2-1',
'father' => 2
],
9 => [
'id' => 9,
'name' => '儿3-1',
'father' => 3
],
10 => [
'id' => 10,
'name' => '儿3-1-1',
'father' => 9
],
11 => [
'id' => 11,
'name' => '儿1-1-1',
'father' => 4
],
12 => [
'id' => 12,
'name' => '儿2-1-1',
'father' => 7
]
];
function generateTree($items)
{
$tree = array();
foreach ($items as $item) {
if (isset($items[$item['father']])) {
$items[$item['father']]['son'][] = &$items[$item['id']];
} else {
$tree[] = &$items[$item['id']];
}
}
return $tree;
}
echo "<pre>";
$tree = generateTree($arr);
print_r($tree);