php无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样
数据库存储
无限极分类其实就是一棵树,所有的节点作为一个存储元素。每个节点可以有任意个孩子节点,且只有一个父节点。
MySQL数据存储,结合项目的数据表存储结构如下:(推荐学习:PHP编程从入门到精通)
CREATE TABLE t_tree_info ( `Fid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '标签自增ID', `Fname` varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称', `Fpid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '父节点id', `Fadd_time` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间', `Fmodify_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`Fid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='无限极分类菜单存储表';
核心字段就是节点自身唯一标识Fid,和对应的父节点标识Fpid。
技术实现
全局数据存储节点
节点数据在项目中是MySQL存储的,现在为了测试,把MySQL数据直接存放到数组里面,全局使用。数据存储如下:
private static $listData = [ [ "Fid" => 1, "Fpid" => 8, "Fname" => '首页', ], [ "Fid" => 2, "Fpid" => 8, "Fname" => '博客', ], [ "Fid" => 3, "Fpid" => 8, "Fname" => '官网', ], [ "Fid" => 4, "Fpid" => 2, "Fname" => '个人博客', ], [ "Fid" => 5, "Fpid" => 2, "Fname" => '他人博客', ], [ "Fid" => 6, "Fpid" => 8, "Fname" => '测试1', ], [ "Fid" => 7, "Fpid" => 8, "Fname" => '测试2', ], [ "Fid" => 8, "Fpid" => 0, "Fname" => '无限极分类', ], [ "Fid" => 9, "Fpid" => 5, "Fname" => '女性栏目', ], [ "Fid" => 10, "Fpid" => 5, "Fname" => '男性栏目', ], ];
引用方式实现无限极分类
思路:
1、即所有待处理的数据进行包装成下标为主键Fid(pk)的数组,便于由Fpid获取对应的父栏目。
2、对包装的数据进行循环,如果为根节点,则将其引用添加到tree中,否则,将其引用添加到其父类的子元素中。这样虽然tree中,只是添加了根节点,但是每个根节点如果有子元素,其中包含了子元素的引用。故能形成树型。
个人觉得引用的设计思路相比递归的思路更容易理解,更直观一些。
代码如下:
/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pk 自增字段(栏目Fid) * @param string $pid parent标记字段 * @return array */ public static function quote_make_tree($list, $pk = 'Fid', $pid = 'Fpid',$child = '_child', $root = 0) { $tree = $packData = []; 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]; } } return $tree; }
引用调用树:
/** * 引用生成树 * @return */ public static function quote_tree_test() { $tree = self::make_tree(self::$listData, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0); echo json_encode($tree); }
返回结果如下:
[ { "Fid": 8, "Fpid": 0, "Fname": "无限极分类", "_child": [ { "Fid": 1, "Fpid": 8, "Fname": "首页" }, { "Fid": 2, "Fpid": 8, "Fname": "博客", "_child": [ { "Fid": 4, "Fpid": 2, "Fname": "个人博客" }, { "Fid": 5, "Fpid": 2, "Fname": "他人博客", "_child": [ { "Fid": 9, "Fpid": 5, "Fname": "女性栏目" }, { "Fid": 10, "Fpid": 5, "Fname": "男性栏目" } ] } ] }, { "Fid": 3, "Fpid": 8, "Fname": "官网" }, { "Fid": 6, "Fpid": 8, "Fname": "测试1" }, { "Fid": 7, "Fpid": 8, "Fname": "测试2" } ] } ]
以上是php无限极分类是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!