【php】无限级分类实现

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

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

先构造数据

$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;
}

运行结果

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值