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

Posted chmily

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无限极分类的实现方法(面试题)相关的知识,希望对你有一定的参考价值。

递归实现无限极分类

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

以上是关于无限极分类的实现方法(面试题)的主要内容,如果未能解决你的问题,请参考以下文章

无限极分类原理与实现(转)

PHP实现无限极分类的两种方式,递归和引用

thinkphp无限极分类

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

无限极分类

Laravel框架实现无限极分类