Php无限层级,并显示层级数

 1, 'name' => '一级菜单a', 'pid' => 0),// pid 父级id
    array('id' => 2, 'name' => '一级菜单b', 'pid' => 0),
    array('id' => 3, 'name' => '二级菜单a', 'pid' => 1),
    array('id' => 4, 'name' => '二级菜单b', 'pid' => 1),
    array('id' => 5, 'name' => '二级菜单c', 'pid' => 2),
    array('id' => 6, 'name' => '二级菜单d', 'pid' => 2),
    array('id' => 7, 'name' => '三级菜单a', 'pid' => 3),
    array('id' => 8, 'name' => '三级菜单b', 'pid' => 3),
    array('id' => 9, 'name' => '四级菜单a', 'pid' => 8),
);

/** 获取所有子节点
 * @param $data 所有节点数组
 * @param $id $pid 父级节点id
 * @param $level  层级
 * @return array
 */
function getTree($data, $pid, $level = 0)
{
    $list = array();
    foreach ($data as $k => $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $v['name'] = $v['name'] . '(' . ($level + 1) . '级)'; // 这里可以加个层级次数
            $v['children'] = getTree($data, $v['id'], $level + 1);
            if ($v['children'] == null) {
                unset($v['children']);
            }
            $list[] = $v;
        }
    }
    return $list;
}

/** 根据子节点获取父节点id
 * @param $data 所有节点数组
 * @param $id   id  主键id
 * @return array
 */
function getParentid($data, $id)
{
    $arr = array();
    foreach ($data as $v) {
        if ($v['id'] == $id) {
            $arr[] = $v;
            //$arr[$v['id']]=$v['name'];
            $arr = array_merge(getParentid($data, $v['pid']), $arr);
        }
    }
    return $arr;

}

$id = 8 ; // 对应的节点是: 三级菜单b 对应的pid 是 3
$pid = 3; // 对应的节点是  二级菜单a

$toparr = getParentid($arr, $id); // 节点为8的所有父节点 id: 1 3  8 这里包含了自身,注意剔除

$level = count($toparr); // 节点所在的层级数
$menu = getTree($arr, $pid, $level-1);
if($pid)
    $menu = array(['name' => '二级菜单a' . '(' . ($level-1) . '级)', 'children' => $menu]);

$json = json_encode($menu);
?>




    
    
    
    Document

    

    




 

Php无限层级,并显示层级数_第1张图片

Php无限层级,并显示层级数_第2张图片

Php无限层级,并显示层级数_第3张图片

$id = 2 ; // 对应的节点是: 一级菜单b 对应的pid 是 0
$pid = 0; // 对应的节点是 0 为 一级节点  显示所有节点,上面的$id用不到

$toparr = getParentid($arr, $id); //

$level = count($toparr); // 节点所在的层级数
$menu = getTree($arr, $pid, $level-1);
if($pid)
    $menu = array(['name' => '二级菜单a' . '(' . ($level-1) . '级)', 'children' => $menu]);

$json = json_encode($menu);

Php无限层级,并显示层级数_第4张图片

你可能感兴趣的:(Php无限层级,并显示层级数)