无限极分类的实现方法(面试题)

递归实现无限极分类

data=[
    {"cat_id":3,"name":"沙河","parent_id":1},
    {"cat_id":4,"name":"sb镇","parent_id":3},
    {"cat_id": 1, "name": "北京", "parent_id": 0},
    {"cat_id":5,"name":"昌平","parent_id":1},
    {"cat_id":6,"name":"青浦","parent_id":2},
    {"cat_id": 2, "name": "上海", "parent_id": 0},
]
# 需求样式
'''
北京
 -沙河
  --sb镇
 -昌平
上海
 -青浦
'''

lis = []
def get_son(data,parent_id=0,level=0,is_clear=True):
    if is_clear:
        lis.clear()
    # 遍历每一条数据对象
    for item in data:
        # 当 parent_id=0时,说明当前对象是父级
        if item['parent_id']==parent_id:
            item['level']=level
            lis.append(item)
            # 递归调用自身 ,继续遍历查找
            get_son(data,parent_id=item["cat_id"],level=level+1,
                                                        is_clear=False)  # 结果:[{'cat_id': 1, 'name': '北京', 'parent_id': 0, 'level': 0}, {'cat_id': 3, 'name': '沙河', 'parent_id': 1, 'level': 1}, {'cat_id': 4, 'name': 'sb镇', 'parent_id': 3, 'level': 2}, {'cat_id': 5, 'name': '昌平', 'parent_id': 1, 'level': 1}, {'cat_id': 2, 'name': '上海', 'parent_id': 0, 'level': 0}, {'cat_id': 6, 'name': '青浦', 'parent_id': 2, 'level': 1}]                                      

用树实现无限极分类

def get_tree(data):
    # 定义一个 空列表和空字典
    lis = []
    tree = {}
    # 先循环遍历每一条数据
    for item in data:
        # 取出每一条数据的 cat_id ,并与当前遍历的数据重新组合放在自定义的 tree字典中,形式如:tree={3: {"cat_id":3,"name":"沙河","parent_id":1}, ...}
        # 得到新组合的tree字典数据 tree = {3:{数据一},4:{数据二}, ...}
        tree[item['cat_id']] = item

    # 再定义一个变量遍历原每一条数据
    for i in data:
        # 如果当前遍历的数据对象中 'parent_id'值为0 (就是没有父级)
        if not i['parent_id']:
            # 1、获取到 tree 字典中与当前对象 对应的 数据对象,2、添加到自定义 lis 表中
            lis.append(tree[i['cat_id']])
        else:
            # 如果当前数据对象 'parent_id'有值,(表示该数据是子级)
            # 1、拿到 parent_id的 值
            parent_id = i['parent_id']
            # 2、通过上步骤拿到的 值 在tree 字典中找到对应的数据对象(父级),判断该对象中是否有 children 字段
            if 'children' not in tree[parent_id]:
                # 3、给父级数据对象添加 children 字段 并赋值为 []
                tree[parent_id]['children'] = []
            # 将当前变遍历对象添加到父级
            # tree[parent_id]['children'].append(tree[i['cat_id']])
            tree[parent_id]['children'].append(i) # 跟上步骤意思相同
    return lis
# 结果:[{'cat_id': 1, 'name': '北京', 'parent_id': 0, 'children': [{'cat_id': 3, 'name': '沙河', 'parent_id': 1, 'children': [{'cat_id': 4, 'name': 'sb镇', 'parent_id': 3}]}, {'cat_id': 5, 'name': '昌平', 'parent_id': 1}]}, {'cat_id': 2, 'name': '上海', 'parent_id': 0, 'children': [{'cat_id': 6, 'name': '青浦', 'parent_id': 2}]}]

原文地址:https://www.cnblogs.com/chmily/p/12055234.html

时间: 2024-08-29 15:22:29

无限极分类的实现方法(面试题)的相关文章

PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,让我们怎么学习嘛,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了. 比如一个category表:有id, name, pid, sort 就这四个简单的字段,不要太复杂了. id    name          pid      sort1     PHP           0   

无限极分类获取数据方法

<?php namespace app\admin\model; use think\Model; class GoodsCate extends Model { //获取分类树 public function get_tree ($pid = 0,$field = '*'){ $list = self::all(function($query)use($pid,$field){ $query->where(['pid'=>$pid])->field($field); }); fo

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

php实现smarty模板无限极分类的方法

本文和大家分享的主要是php中 实现smarty 模板无限极分类相关内容,一起来看看吧,希望对大家 学习php有所帮助. <?php $conn = mysql_connect("localhost","admin","admin"); mysql_select_db("people_shop",$conn); mysql_query("SET NAMES 'UTF-8'"); $class_arr=

PHP无限极分类生成树方法

你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,整理分享了. function generateTree($items){ $tree = array(); foreach($items as $item){ if(isset($items[$item['pid']])){ $items[$item['pid']]['son'][] = &$items[$item['id']]; }els

用递归的方法实现无限极分类

通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ---------------------------- DROP TABLE IF

夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)

我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是出现了,但是没有向我们平常时候见到的无限极分类一样噢,一般比如分类 多多,分类下面的 好多美女啊 是多多的下级分类,那么好多美女啊他前面是有几个空格之类的隔开, 那么我们就需要在model层里面对她进行排序的设置了: <?php namespace Admin\Model; use Think\Mo

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------

PHP无限极分类详谈

当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,让我们怎么学习嘛,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了. 比如一个category表:有id, name, pid, sort 就这四个简单的字段,不要太复杂了. id    name          pid      sort1     PHP           0       1