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

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

https://blog.csdn.net/x947955250/article/details/81779628

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无限分类的方法有多种,其中包括递归和非递归两种方式。下面分别介绍一下这两种方法的实现。 1. 递归实现无限分类 递归实现无限分类的方法是将分类数据作为一个树形结构来处理。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为树形结构。 (2)遍历树形结构,输出每个分类的名称以及子分类的名称。 (3)对于每个子分类,重复步骤(2)。 下面是一个递归实现无限分类的示例代码: ```php function getCategoryTree($parent_id = 0, $level = 0) { $categories = getCategoryByParentId($parent_id); if (count($categories) > 0) { foreach ($categories as $category) { echo str_repeat('-', $level) . $category['name'] . '<br>'; getCategoryTree($category['id'], $level + 1); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 2. 非递归实现无限分类 非递归实现无限分类的方法是使用堆栈(或队列)来处理分类数据。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为一个数组。 (2)将根分类(即 parent_id 为 0 的分类)入栈。 (3)从堆栈中取出一个分类,并输出该分类的名称。 (4)将该分类的所有子分类依次入栈。 (5)重复步骤(3)和(4),直到堆栈为空。 下面是一个非递归实现无限分类的示例代码: ```php function getCategoryTree() { $categories = getCategoryByParentId(0); $stack = array(); foreach ($categories as $category) { array_push($stack, array('category' => $category, 'level' => 0)); } while (count($stack) > 0) { $current = array_pop($stack); echo str_repeat('-', $current['level']) . $current['category']['name'] . '<br>'; $children = getCategoryByParentId($current['category']['id']); foreach ($children as $child) { array_push($stack, array('category' => $child, 'level' => $current['level'] + 1)); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 以上就是php实现无限分类的两种方法。从实现难度和效率上来看,递归方法更简单,但对于数据量较大的情况,可能会导致栈溢出。非递归方法虽然复杂一些,但可以处理更大的数据量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值