【php】无限级分类实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x947955250/article/details/81779628

通常写项目的时候,在写一些例如后台的栏目分类或者是商城分类的时候需要实现对应分类的上级分类,一般就会用到无限级分类来进行分类(主要是怕忘了怎么写,所以先记下来)

实现无限级分类,通常有两种方法,递归和引用

先构造数据

$arr = array(
            1 => array('id' => 1, 'pid' => 0, 'name' => '中国'),
            2 => array('id' => 2, 'pid' => 0, 'name' => '美国'),
            3 => array('id' => 3, 'pid' => 1, 'name' => '广东省'),
            4 => array('id' => 4, 'pid' => 3, 'name' => '广州市'),
            5 => array('id' => 5, 'pid' => 4, 'name' => '天河区'),
            6 => array('id' => 6, 'pid' => 1, 'name' => '湖南省'),
            7 => array('id' => 7, 'pid' => 2, 'name' => '洛杉矶'),
            8 => array('id' => 8, 'pid' => 6, 'name' => '长沙市'),
            9 => array('id' => 9, 'pid' => 2, 'name' => '华盛顿'),
        );

模拟数据库中的数据,主要是添加pid字段方便区别分类。。。

1、递归

function getTree($array, $pid =0, $level = 0){

        
        static $list = [];    //定义静态数组
        foreach ($array as $key => $value){        //第一次遍历,找到pid=0的节点

            if ($value['pid'] == $pid){            //pid为0的节点,是第一级,也就是顶级分类
                
                $value['level'] = $level;            
                
                $list[] = $value;                    //把数组放到list中
                
                unset($array[$key]);                //把这个节点从数组中移除,减少后续递归消耗
                
                getTree($array, $value['id'], $level+1);            //开始递归,查找父id为该节点id的节点,级别则为原级别+1

            }
        }
        return $list;
        
    }

经过上述操作,已经实现了分类,接下来可以增加一点层次结构。。。

完整代码

$arr = array(
            1 => array('id' => 1, 'pid' => 0, 'name' => '中国'),
            2 => array('id' => 2, 'pid' => 0, 'name' => '美国'),
            3 => array('id' => 3, 'pid' => 1, 'name' => '广东省'),
            4 => array('id' => 4, 'pid' => 3, 'name' => '广州市'),
            5 => array('id' => 5, 'pid' => 4, 'name' => '天河区'),
            6 => array('id' => 6, 'pid' => 1, 'name' => '湖南省'),
            7 => array('id' => 7, 'pid' => 2, 'name' => '洛杉矶'),
            8 => array('id' => 8, 'pid' => 6, 'name' => '长沙市'),
            9 => array('id' => 9, 'pid' => 2, 'name' => '华盛顿'),
        );


echo "<pre>";

$a=getTree($arr);

foreach($a as $value){
       echo str_repeat('----', $value['level']), $value['name'].'<br />';
}





function getTree($array, $pid =0, $level = 0){

        
        static $list = [];    //定义静态数组
        foreach ($array as $key => $value){        //第一次遍历,找到pid=0的节点

            if ($value['pid'] == $pid){            //pid为0的节点,是第一级,也就是顶级分类
                
                $value['level'] = $level;            
                
                $list[] = $value;                    //把数组放到list中
                
                unset($array[$key]);                //把这个节点从数组中移除,减少后续递归消耗
                
                getTree($array, $value['id'], $level+1);            //开始递归,查找父id为该节点id的节点,级别则为原级别+1

            }
        }
        return $list;
        
    }

运行结果

2、引用

/*引用传值*/
function generateTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    $tree     = array();
    $packData = array();
    foreach ($list as $data) {
        $packData[$data[$pk]] = $data;
    }

    foreach ($packData as $key => $val) {

    	//判断是不是根节点,如果是那么就把根节点数组的引用赋给新数组
        if ($val[$pid] == $root) {
            $tree[] = &$packData[$key];
        } else {
            
            $packData[$val[$pid]][$child][] = &$packData[$key];       //子类数组赋值给父类数组中键为$child的数组 
        }
    }
    return $tree;
}

完整代码

$arr = array(
            1 => array('id' => 1, 'pid' => 0, 'name' => '中国'),
            2 => array('id' => 2, 'pid' => 0, 'name' => '美国'),
            3 => array('id' => 3, 'pid' => 1, 'name' => '广东省'),
            4 => array('id' => 4, 'pid' => 3, 'name' => '广州市'),
            5 => array('id' => 5, 'pid' => 4, 'name' => '天河区'),
            6 => array('id' => 6, 'pid' => 1, 'name' => '湖南省'),
            7 => array('id' => 7, 'pid' => 2, 'name' => '洛杉矶'),
            8 => array('id' => 8, 'pid' => 6, 'name' => '长沙市'),
            9 => array('id' => 9, 'pid' => 2, 'name' => '华盛顿'),
        );


echo "<pre>";
print_r(generateTree($arr));




/*引用传值*/
function generateTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    $tree     = array();
    $packData = array();
    foreach ($list as $data) {
        $packData[$data[$pk]] = $data;
    }

    foreach ($packData as $key => $val) {

    	//判断是不是根节点,如果是那么就把根节点数组的引用赋给新数组
        if ($val[$pid] == $root) {
            $tree[] = &$packData[$key];
        } else {
            
            $packData[$val[$pid]][$child][] = &$packData[$key];       //子类数组赋值给父类数组中键为$child的数组 
        }
    }
    return $tree;
}

运行结果

猜你喜欢

转载自blog.csdn.net/x947955250/article/details/81779628
今日推荐