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

它就是PHPTree。

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

或从脚本之家下载 http://www.jb51.net/codes/606002.html

最简单的例子:

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 '

PHPTree树形结构

';

echo '';

foreach($r as $item){

echo '';

//根据所在的层次缩进

echo str_repeat('......',$item['level']);

echo $item['name'];

echo '';

}

echo '';

演示:

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无限分级快速,PHPTree——php快速生成无限级分类_php技巧相关推荐

  1. Stark 组件:快速开发神器 —— 自动生成 URL

    说道 Stark 你是不是不会想到他--Tony Stark,超级英雄钢铁侠,这也是我的偶像. 不过我们今天要开发的 Stark 组件,倒是跟他的人工智能助手 JARVIS 有些类似,是帮助我们快速开 ...

  2. python全局键盘监听(pynput快捷键);利用pywin32快速截屏并生成视频

    python全局键盘监听(pynput快捷键):利用pywin32快速截屏并生成视频 第一次在CSDN写博客,有点小紧张(/ω\) 以下内容完全个人理解,有错误请指出~ 最近在用python做一个小工 ...

  3. 无限纷争服务器几天更新,无限纷争死神觉醒怎么快速升级 新手快速升级方法攻略...

    类型:动作射击大小:546M语言:中文 评分:10.0 标签: 立即下载 无限纷争死神觉醒前期等级永远是第一战斗力,提升等级可以解锁技能和玩法,加速游戏的发展,那么无限纷争死神觉醒怎么快速升级,下面带 ...

  4. Eclipse和IDEA中 xml快速注释和快速生成注释那个符号 !-- --

    1.快速注释和快速取消一行或者多行: 方法:先选中内容,再同时按住 Ctrl + / 2.快速生成一个注释符号 : 方法:同时按住Ctrl + /,是在空白处按 3.注释掉选中内容(不是注释整行) 方 ...

  5. html左侧分级导航,jquery实现无限分级横向导航菜单的方法

    本文实例讲述了jquery实现无限分级横向导航菜单的方法.分享给大家供大家参考.具体实现方法如下: 1. jquery插件版本代码如下: (function($){ $.fn.extend({ dro ...

  6. 快速卷积与快速相关——MATLAB

    一.实验目的 1.学会FFT算法程序(或函数)的使用方法; 2.了解序列的线性卷积和圆周卷积之间的关系; 3.验证有限长FFT算法实现线性相关运算的快速计算方法; 4.解FFT的点数对快速卷积与快速相 ...

  7. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  8. 快速开发平台快速开发程序

    快速开发平台快速开发程序 1.数据字典如下图: 2.界面设计器代码如下 1 <object name="" assembly="System.Windows.For ...

  9. r dataframe 转成向量_快速掌握R语言中类SQL数据库操作技巧

    在数据分析中,往往会遇到各种复杂的数据处理操作:分组.排序.过滤.转置.填充.移动.合并.分裂.去重.找重.填充等操作.这时候R语言就是一个很好的选择:R可以高效地.优雅地解决数据处理操作.(本章节为 ...

最新文章

  1. Java输入输出(io)流详解、图解
  2. Delphi 调用C#编写的WebService
  3. PHP常用算法和数据结构示例(必看篇)
  4. 结构化数据存储,如何设计才能满足需求?
  5. TensorFlow 2.0 快速入门指南 | iBooker·ApacheCN
  6. Spring(6)---自动装配Beans
  7. Android 网络HTML查看器
  8. Http Handler 介绍
  9. python语言程序设计教程赵璐电子版_python语言程序设计教程 赵璐pdf 相关实例(示例源码)下载 - 好例子网...
  10. xhEditor富文本编辑器的使用说明
  11. LeetCode刷题-反转字符串中的元音字母
  12. The type initializer for ‘Gdip‘ threw an exception
  13. 赵小楼《天道》《遥远的救世主》深度解析(39)芮小丹的恋爱态度:敞亮
  14. 股东转让股权的条件是什么
  15. 如果遇到压力面试应该怎么办?应对压力面试有什么技巧?
  16. 大规模分布式与并行数据库架构
  17. Jetson Nano通过笔记本实现网络连接
  18. 金雅拓推出两项全新的身份证件安全增强功能
  19. 编写一个带有main函数的类,调用上面的汽车类,实例化奔驰、大众、丰田等不同品牌和型号,模拟开车过程:启动、加速、转弯、刹车、息火,实时显示速度。...
  20. Windows电脑桌面透明云便签怎么自定义设置便签快捷键?

热门文章

  1. ICPC程序设计题解书籍系列之五:吴永辉:《数据结构编程实验》(第2版)
  2. CCF NOI1067 最匹配的矩阵
  3. Batch Normalization 反向传播(backpropagation )公式的推导
  4. 熵的理解(玻尔兹曼分布)
  5. Spark —— RDD、DataFrame 与 Dataset
  6. Python Tricks(八)—— 斐波那契数列的另类实现
  7. Spark standalone 模式下的集群部署
  8. 三局两胜还是五局三胜?
  9. tomcat报错无法启动组件_微软正在修复Windows Server无法启动的0xc0000001报错故障
  10. micropython和python区别-什么是MicroPython?