PHPTree――php快速生成无限级分类


Posted in PHP onMarch 30, 2018

它就是PHPTree。

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

或从三水点靠木下载 https://3water.com/codes/606002.html

最简单的例子:

<?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,大家可以参考。

演示:

PHPTree――php快速生成无限级分类

如果不需要使用前端框架,只是用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>';

演示:

PHPTree――php快速生成无限级分类

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也是支持的。

PHP 相关文章推荐
php 中的str_replace 函数总结
Apr 27 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
实例化php类时传参的方法分析
Jun 05 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 #PHP
PHP实现动态删除XML数据的方法示例
Mar 30 #PHP
PHP实现动态添加XML中数据的方法
Mar 30 #PHP
PHP实现动态创建XML文档的方法
Mar 30 #PHP
php实现微信模板消息推送
Mar 30 #PHP
Mac系统下安装PHP Xdebug
Mar 30 #PHP
php实现websocket实时消息推送
Mar 30 #PHP
You might like
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python脚本第一行如何写
2020/08/30 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
机关门卫的岗位职责
2014/04/29 职场文书
应聘会计求职信
2014/06/11 职场文书
会计个人实习计划书
2014/08/15 职场文书
放飞理想演讲稿
2014/09/09 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
春节晚会开场白
2015/05/29 职场文书