一个菜鸟驿站!

递归树形分类(简单版+升级版+树行结构图)

PHP 2018-04-21 浏览(2036) 评论(0)
- N +

文章目录 [+]

用递归写一个树行结构的分类树吧,由浅入深,一步一步的走,上边是最简单的,大哥哥们可以借鉴的看看,么么哒


首先数据结构如下:

<?php
return array(
    0 =>
        array(
            'id' => 27,
            'name' => '系统',
            'sort' => 100,
            'pid' => 0,
        ),
    1 =>
        array(
            'id' => 28,
            'name' => 'linux',
            'sort' => 100,
            'pid' => 27,
        ),
    2 =>
        array(
            'id' => 29,
            'name' => 'Centos',
            'sort' => 100,
            'pid' => 28,
        ),
    3 =>
        array(
            'id' => 30,
            'name' => 'Ubuntu',
            'sort' => 100,
            'pid' => 28,
        ),
    4 =>
        array(
            'id' => 31,
            'name' => 'Kali',
            'sort' => 100,
            'pid' => 28,
        ),
    5 =>
        array(
            'id' => 32,
            'name' => 'Ubuntu1604',
            'sort' => 100,
            'pid' => 30,
        ),
    6 =>
        array(
            'id' => 33,
            'name' => 'Ubuntu1610',
            'sort' => 100,
            'pid' => 30,
        ),
    7 =>
        array(
            'id' => 34,
            'name' => 'Windows',
            'sort' => 100,
            'pid' => 27,
        ),
    8 =>
        array(
            'id' => 35,
            'name' => 'Win7',
            'sort' => 100,
            'pid' => 34,
        ),
    9 =>
        array(
            'id' => 36,
            'name' => '程序',
            'sort' => 100,
            'pid' => 0,
        ),
    10 =>
        array(
            'id' => 37,
            'name' => '前端',
            'sort' => 100,
            'pid' => 36,
        ),
    11 =>
        array(
            'id' => 38,
            'name' => 'PHP',
            'sort' => 100,
            'pid' => 36,
        )
);

然后下边是最简单的一个递归分类:

<?php

/**
 * 递归分类(最简单版本)
 * @param $data         所有分类
 * @param int $pid      pid(父级ID)(可以自己指定pid)
 */
function gettree($data,$pid = 0){
    static $arr = [];       //  定义一个静态变量,用来接收结果
    foreach ($data as $key => $value){      //  循环变量
        if($value['pid'] == $pid){          //  如果$value的pid等于父级id(也就是$pid),说明就是他的子集
            $arr[] = $value;                //  添加到数组中
            gettree($data, $value['id']);   //  然后再次循环,要注意子集的id是子集的父id,千万别写成$value['pid']
        }
    }
    return $arr;            //  返回变量
}

$tree = gettree($all,0);
echo '<pre>';
print_r($tree);

递归树形分类(简单版+升级版+树行结构图)  第1张


写下边的是加上深度以及名字结构的递归分类

<?php
/**
 * 树形结构(获取pid里的)
 * @param $all      所有数据
 * @param int $pid 父级id
 * @param int $dep 深度
 * @param null $default 为了清空静态变量(有时候foreach这个gettree的时候,会导致里面的$arr不是空的,所以给个判断)
 * @return array    返回数据
 */
function gettree($all, $pid = 0, $dep = 1, $default = null)
{
    static $arr = [];   //  定义静态变量
    if (is_array($default)) {   //  判断如果$default是个空数组,那么就让$arr滞空
        $arr = $default;        //  滞空$arr
    }
    foreach ($all as $key => $value) {  //  循环数组
        if ($value['pid'] == $pid) {    //  说明是pid的子类
            $nbsp = addprefix($dep);    //  根据深度去给name一个结构 例如:|─分类
            $value['_cname'] = $nbsp . $value['name'];  //  将这个附加到里面
            $value['dep'] = $dep;       //  将深度也写进去
            $arr[] = $value;            //  追加到数组中
            gettree($all, $value['id'], $dep + 1);  //根据让深度变成+1,递归
        }
    }
    return $arr;    //  返回数组
}

/**
 * 根据数组追加前缀
 * @param $dep  深度
 * @return string
 */
function addprefix($dep)
{
    $nbsp = '';
    if ($dep == 2) { //  如果深度为2,就给他|-这个样式
        $nbsp .= "|─ ";
    }
    if ($dep > 2) {  //  如果大于2,就按照深度给不同的空格
        for ($i = 0; $i < $dep - 1; $i++) {
            $nbsp .= "|&nbsp;&nbsp;&nbsp;&nbsp;";
        }
        $nbsp .= "└─ ";
    }
    return $nbsp;
}

$tree = gettree($all,0);
p($tree);

递归树形分类(简单版+升级版+树行结构图)  第2张

下边的是重头菜,树行图如下:

<?php
/**
 * 树形结构(获取pid里的)
 * @param $all      所有数据
 * @param int $pid 父级id
 * @param int $dep 深度
 * @param null $default 为了清空静态变量(有时候foreach这个gettree的时候,会导致里面的$arr不是空的,所以给个判断)
 * @return array    返回数据
 */
function gettree($all, $pid = 0, $dep = 1, $default = null)
{
    $arr = [];   //  定义静态变量
    if (is_array($default)) {   //  判断如果$default是个空数组,那么就让$arr滞空
        $arr = $default;        //  滞空$arr
    }
    foreach ($all as $key => $value) {  //  循环数组
        if ($value['pid'] == $pid) {    //  说明是pid的子类
            $nbsp = addprefix($dep);    //  根据深度去给name一个结构 例如:|─分类
            $value['_cname'] = $nbsp . $value['name'];  //  将这个附加到里面
            $value['dep'] = $dep;       //  将深度也写进去
            $value["sons"] = gettree($all, $value['id'], $dep + 1);  //根据让深度变成+1,递归
            $arr[] = $value;            //  追加到数组中
        }
    }
    return $arr;    //  返回数组
}

/**
 * 根据数组追加前缀
 * @param $dep  深度
 * @return string
 */
function addprefix($dep)
{
    $nbsp = '';
    if ($dep == 2) { //  如果深度为2,就给他|-这个样式
        $nbsp .= "|─ ";
    }
    if ($dep > 2) {  //  如果大于2,就按照深度给不同的空格
        for ($i = 0; $i < $dep - 1; $i++) {
            $nbsp .= "|&nbsp;&nbsp;&nbsp;&nbsp;";
        }
        $nbsp .= "└─ ";
    }
    return $nbsp;
}

$tree = gettree($all,0);
p($tree);

递归树形分类(简单版+升级版+树行结构图)  第3张


标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔