文档章节

PHPTree——快速生成无限多级分类

crazymus
 crazymus
发布于 2015/08/12 13:18
字数 687
阅读 13654
收藏 49

在开发中经常需要用到树形数据,比如无限多级分类,就是典型的树形结构。这里面的算法,用到了递归思想,为了简化开发过程,我编写了一个工具来提升开发效率,

它就是PHPTree。

git地址:https://git.oschina.net/jiusem/PHPTree.git

最简单的例子:

<?php 
require('PHPTree.class.php');

//原始数据, 从数据库读出
$data = array(
	array(
		'id'=>1,
		'name'=>'book',
		'parent_id'=>0
	),
	array(
		'id'=>2,
		'name'=>'music',
		'parent_id'=>0
	),
	array(
		'id'=>3,
		'name'=>'book1',
		'parent_id'=>1
	),
	array(
		'id'=>4,
		'name'=>'book2',
		'parent_id'=>3
	)
);

$r = PHPTree::makeTree($data);
echo json_encode($r);

?>

输出:

 [
        {
            "id": 1,
            "name": "book",
            "parent_id": 0,
            "expanded": false, //不展开子节点
            "children": [
                {
                    "id": 3,
                    "name": "book1",
                    "parent_id": 1,
                    "expanded": false,
                    "children": [
                        {
                            "id": 4,
                            "name": "book2",
                            "parent_id": 3,
                            "leaf": true
                        }
                    ]
                }
            ]
        },
        {
            "id": 2,
            "name": "music",
            "parent_id": 0,
            "leaf": true
        }
]

生成的数据就是树形结构了,可以结合ExtJS等前端框架来使用了。git中包含了一个ExtJS的demo,大家可以参考。

演示:

如果不需要使用前端框架,只是用HTML输出,可以使用下面的方法:

$r = PHPTree::makeTreeForHtml($data);

得到一个一维数组,用 level 字段来标识分类的层次:

array(
    array(
        'id'=>1,
        'name'=>'用户管理',
        'parent_id'=>0,
        'level'=>0 //一级分类
    ),
    array(
        'id'=>1,
        'name'=>'用户列表',
        'parent_id'=>1,
        'level'=>1 //二级分类
    )
    ....
);

输出为select标签:

echo '<h1>PHPTree树形结构</h1>';
echo '<select  style="width:300px;">';
foreach($r as $item){
	echo '<option>';
	//根据所在的层次缩进
	echo str_repeat('......',$item['level']);
	echo $item['name'];
	echo '</option>';
}
echo '</select>';

演示:

git中包含了一个输出HTML的demo,大家可以参考。

关于数据库的设计,只需要保证包含 id 和 parent_id 字段即可,其他字段可以自行添加,不会影响数据生成。parent_id是父级ID,如果是一级分类,就设为 0 。当然,字段也是可以配置的。请继续往下看,我将介绍一些进阶的使用方法。

展开子节点:

PHPTree::makeTree( $data, array(
    'expanded' => true
));

输出的数据为:

[
        {
            id:1,
            name:'book1',
            expanded:true,//展开子节点
            children:[
                ...
            ]
        }
]

自定义主键和父键:

//数据库读出
$data = array(
    array(
        'order_id'=>1, //主键
        'name'=>'book1',
        'pid'=>0, //父键
        ...
    )
);
PHPTree::makeTree( $data, array(
    'primary_key' => 'order_id',
    'parent_key'  => 'pid'
));

输出的数据为:

[
        {
            order_id:1,
            name:'book1',
            pid:0,
            ...
        }
]

makeTreeForHtml 方法也支持配置主键和父键。

还有其他字段也可以自定义,但下面这些参数仅支持 makeTree 方法:

$r = PHPTree::makeTree($data, array(
    'expanded_key' => 'expanded',
    'children_key' => 'children',
    'leaf_key'     => 'leaf'
));

默认,这些字段的配置都是以ExtJS为参考的,如果你使用zTree框架的话,这些字段就需要重新配置了。

zTree 是一款强大的国产树形框架,它还支持 简单JSON格式,是一维数据格式,实际上就不需要用到PHPTree了。当然,PHPTree输出的数据层次感清晰,zTree也是支持的。

© 著作权归作者所有

crazymus

crazymus

粉丝 70
博文 79
码字总数 110439
作品 8
后端工程师
私信 提问
加载中

评论(10)

y
ydtg1993
PHP系统树图 https://github.com/ydtg1993/dendrogram
两种数据结构 清爽的ui界面 组件化引入更方便
crazymus
crazymus 博主

引用来自“877850838”的评论

老板麻烦出个输出HTML树形结构的例子照顾下新手.谢谢.
你可以尝试一下zTree这个开源框架。
8
877850838
老板麻烦出个输出HTML树形结构的例子照顾下新手.谢谢.
crazymus
crazymus 博主

引用来自“Heanes”的评论

这个类目前能根据数组生成全体结构树,我觉得还需要有,根据已知数组,得到某个节点的家族树
感谢建议,我会在升级中考虑加入这个特性~
Heanes
Heanes
这个类目前能根据数组生成全体结构树,我觉得还需要有,根据已知数组,得到某个节点的家族树
crazymus
crazymus 博主

引用来自“张敏峰”的评论

parent_id 指向的id可以后出现吗?

可以的,怎么排序没有影响0
BossKiller
BossKiller
parent_id 指向的id可以后出现吗?
crazymus
crazymus 博主
嗯,感谢你的建议,我会继续完善它0
crazymus
crazymus 博主
嗯,感谢你的建议,我会继续完善它0
ijackwu
ijackwu
或许 makeTree 方法传入参数 变成 下面这样是否更通用一些
<pre>
  public static function makeTree($data, $item_id = "id", $parent_id = "parent_id")
</pre>
PHPTree 1.1 发布,PHP 树形结构生成库

PHPTree 是一个优雅而简洁的树形结构生成库,帮助 PHP程 序员快速生成树形结构,可以和 zTree、ExtJS 等前端框架整合使用。树形结构在软件开发中非常普遍,典型的应用就是无限多级分类,经验...

crazymus
2015/08/18
3.4K
5
PHPTree 1.2 发布,树形结构工具

PHPTree 是一个优雅而简洁的树形结构生成库,用于快速生成树形结构,可以和 zTree、ExtJS 等前端框架整合使用,也可以不依赖框架,轻松输出自定义的HTML结构。PHPTree的目标是,让树形结构像...

crazymus
2015/08/27
4.5K
6
PHP树形结构--PHPTree

在开发中经常需要用到树形数据,比如无限多级分类,就是典型的树形结构。这里面的算法,用到了递归思想,为了简化开发过程,我编写了一个工具来提升开发效率,它就是PHPTree。使用PHPTree,可...

crazymus
2015/08/12
3.1K
0
JEECG 3.5.0 GA 发布,JAVA智能开发平台

JEECG Framework 3.5.0 GA 新春版本发布《数据权限、多数据源、国际化、三大模块》 平台介绍: JEECG(J2EE Code Generation): 是一款基于代码生成器的JAVA智能开发平台。 引领新开发模式(...

Jeecg
2015/03/10
25.1K
21
氚云CRM产品的详细介绍

1 产品价值 1.1 核心优势 1.2 销售管理者的烦恼 1.3 产品价值-解决销售人员的烦恼 1.4 氚云CRM帮助企业提高工作效率、促进团队业绩顺利达成 从客户开发、外勤,联系人的维护,客户的跟进商机...

lwl_BPM
2017/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
12
0
聊聊Tomcat中的连接器(Connector)

上期回顾 上一篇文章《Tomcat在SpringBoot中是如何启动的》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Conne...

木木匠
今天
9
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
2.4K
22
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
42
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部