商城笔记(家谱树2) —— 无限极分类之递归找家谱树

/*
无限极分类之递归找家谱树

家谱树的应用:如面包屑导航
*/

echo '<pre >';

$area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'濉溪县','parent'=>5),
array('id'=>4,'name'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>2)
);

/*
先来人肉 上地 的家谱树

  北京
    海淀
      上地

上地[parent==2]
海淀[id==2,parent==7]
北京[id==7,parent==0]

parent==0,到头
*/

家谱树(一) 先找出上地

function familytree1($arr,$id) {
    $tree = array();

    foreach($arr as $v) {
        if($v['id'] == $id) {
            $tree = $v; // 以找到上地为例
        }
    }

    return $tree;
}

print_r(familytree1($area,8));
/*
Array
(
    [id] => 8
    [name] => 上地
    [parent] => 2
)
*/

家谱树(二) 判断上地有没父栏目并将其父栏目也找出来

function familytree2($arr,$id) {
    static $tree = array();

    foreach($arr as $v) {
        if($v['id'] == $id) {
            $tree[] = $v; // 以找到上地为例

            // 判断要不要找父栏目
            if($v['parent'] > 0) { // parent>0,说明有父栏目
                 familytree2($arr,$v['parent']);
            }
        }
    }

    return $tree;
}

print_r(familytree2($area,8));
/*
Array
(
    [0] => Array
        (
            [id] => 8
            [name] => 上地
            [parent] => 2
        )

    [1] => Array
        (
            [id] => 2
            [name] => 海淀
            [parent] => 7
        )

    [2] => Array
        (
            [id] => 7
            [name] => 北京
            [parent] => 0
        )
) 
*/

家谱树(三) 升级一下代码

function familytree3($arr,$id) {
    static $tree = array();

    foreach($arr as $v) {
        if($v['id'] == $id) {
            $tree[] = $v; // 以找到上地为例

            // 判断要不要找父栏目
            if($v['parent'] > 0) { // parent>0,说明有父栏目
                 array_merge($tree,familytree3($arr,$v['parent']));
            }
        }
    }

    return $tree; 
}

print_r(familytree3($area,8));
/*
Array
(
    [0] => Array
        (
            [id] => 8
            [name] => 上地
            [parent] => 2
        )

    [1] => Array
        (
            [id] => 2
            [name] => 海淀
            [parent] => 7
        )

    [2] => Array
        (
            [id] => 7
            [name] => 北京
            [parent] => 0
        )
)

上地->海淀->北京
*/

家谱树(四) 将输出顺序颠倒过来,符合正常寻找顺序

function familytree4($arr,$id) {
    static $tree = array();

    foreach($arr as $v) {
        if($v['id'] == $id) {          
            // 判断要不要找父栏目
            if($v['parent'] > 0) { // parent>0,说明有父栏目
                 array_merge($tree,familytree4($arr,$v['parent']));
            }

            $tree[] = $v; // 以找到上地为例
        }
    }

    return $tree; 
}

print_r(familytree4($area,8));
/*
Array
(
    [0] => Array
        (
            [id] => 7
            [name] => 北京
            [parent] => 0
        )

    [1] => Array
        (
            [id] => 2
            [name] => 海淀
            [parent] => 7
        )

    [2] => Array
        (
            [id] => 8
            [name] => 上地
            [parent] => 2
        )
)

北京->海淀->上地
*/

猜你喜欢

转载自blog.csdn.net/dyw_666666/article/details/81021721