手把手教你用php实现无限极分类功能

Posted WXiangQian王先森

tags:

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

php轻松实现无限极分类功能

本文的 todo 都是需要自行修改的

文章目录

应用场景

如:

  • 面包屑导航
  • 分类(如:商品分类、课程分类、城市)
  • 文件夹

数据表设计

code字段是为了方便筛选

// todo 表名需要更换
CREATE TABLE `表名` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `pid` int(11) unsigned NOT NULL DEFAULT '0',
  `name` varchar(191) COLLATE utf8_unicode_ci NOT NULL COMMENT '名称',
  `code` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT 'code码:上级code+本级id+pid',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='XXX';

数据表数据

无限极分类的列表处理逻辑

因为是demo,所以都整合到一个function了,请自行拆分

public function getList()

	// todo 先查询出数据表的所有数据 data
	$data = Model::get();
	// 处理数据
	$source = [];
	foreach ($data as $v) 
	    $source[] = [
	        'id' => $v->id,
	        'pid' => $v->pid,
	        'name' => $v->name,
	        'code' => $v->code
	    ];
	
	// 生成tree数据
	$pk = 'id'; //主键标记字段
	$pid = 'pid'; //parent标记字段
	$child = 'children';//child标记字段
	$root = 0;
	$list = $source //要转换的二维结果集
	$tree = [];
	if (is_array($list)) 
	    //创建基于主键的数组引用
	    $refer = array();
	    foreach ($list as $key => $data) 
	        $refer[$data[$pk]] = &$list[$key];
	        //判断是否存在parent
	        $parantId = $data[$pid];
	        if ($root == $parantId) 
	            $tree[] = &$list[$key];
	         else 
	            if (isset($refer[$parantId])) 
	                $parent = &$refer[$parantId];
	                $parent[$child][] = &$list[$key];
	            
	        
	    
	
	return response()->json([
            'code' => '1',
            'msg' => 'success,
            'data' => $tree
        ]);

api返回格式


    "code": 1,
    "msg": "success",
    "data": [
        
            "id": 1,
            "pid": 0,
            "name": "北京",
            "code": "10",
            "children": [
                
                    "id": 2,
                    "pid": 1,
                    "name": "昌平",
                    "code": "1021",
                    "children": [
                        
                            "id": 3,
                            "pid": 2,
                            "name": "回龙观",
                            "code": "102132",
                            "children": [
                                
                                    "id": 4,
                                    "pid": 3,
                                    "name": "金域华府",
                                    "code": "10213243"
                                ,
                                
                                    "id": 8,
                                    "pid": 3,
                                    "name": "融泽家园",
                                    "code": "10213283"
                                
                            ]
                        ,
                        
                            "id": 5,
                            "pid": 2,
                            "name": "龙泽",
                            "code": "102152",
                            "children": [
                                
                                    "id": 7,
                                    "pid": 5,
                                    "name": "龙华园",
                                    "code": "10215275"
                                ,
                                
                                    "id": 9,
                                    "pid": 5,
                                    "name": "龙泽苑",
                                    "code": "10215295"
                                
                            ]
                        
                    ]
                ,
                
                    "id": 6,
                    "pid": 1,
                    "name": "朝阳",
                    "code": "1061"
                
            ]
        
    ]

拼装无限极分类name

拼装的字符串实例:

  • 北京/昌平/回龙观
  • 北京/昌平
public function getData()

	// 以code为key的分类信息
	$codeList = [];
	// 先查询出数据表的所有数据 list
	$list = Model::get();
	foreach ($list as $v) 
      $codeList[$v['code']] = $v;
  	
	// todo $data 其它列表数据
	foreach($data as &$v) 
		// todo child需要自己拼装
		$child = [
			'pid' => 1,
			'name' => '昌平'
		];
		 if ($child['pid'] && $child['name']) 
            $deptName = $this->getDeptName($departmentList, $child);
         else 
            $deptName = $child['name'] ?? '-';
        
		$v['str'] = $deptName;
	


/**
 * 拼接组织架构字符串
 * @param $data []
 * @param $child []
 * @return mixed
 * User: WXiangQian
 */
public function getDeptName($data, $child)

    $pid = $child['pid'];
    if ($child['pid'] == 0) 
        return $child['name'];
    
    foreach ($data as $k => $v) 
        if ($child['pid'] == $v['id']) 
        	// todo 暂时用 / 去拼接的,也可以用 - 自定义
            $child['name'] = $v['name'] . '/' . $child['name'];
            $child['pid'] = $v['pid'];
            unset($data[$k]);
        
    
	// 未找到数据,则返回 “-” 数据
    if ($pid == $child['pid']) 
        return '-';
    
    return $this->getDeptName($data, $child);

实现效果图


php轻松实现无限极分类功能就简单到这了,期待你的关注👍

以上是关于手把手教你用php实现无限极分类功能的主要内容,如果未能解决你的问题,请参考以下文章

无限极分类中递归查找一个树结构

php无限极分类实现的方法?

PHP使用引用实现无限极分类

手把手教你用鸿蒙HarmonyOS实现微信聊天界面

php递归无限极分类怎么弄

php实现无限极分类