根据子节点获取所有的父节点以及父节点的父节点..
<?php
/**
* 认真编码 快乐生活
* User: helloJiu
* Date: 2018/9/12
* Time: 11:44
*/
$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;
}
根据节点获取所有子节点id
<?php
/**
* 认真编码 快乐生活
* User: helloJiu
* Date: 2018/9/12
* Time: 11:44
*/
$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);
print_r(getAllChild([1,2], $result));
/**
* 查出ids所有子节点, 包含自己
* @param $pids 需要查找的ids
* @param $collects 所有id和父类id集合
* @return array
*/
function getAllChild($pids, &$collects){
$map = [];
foreach($collects 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;
}