stefangabos / zebra_mptt
一个提供修改前序树遍历算法实现的PHP库
Requires
- php: >=5.0.0
README
Zebra Mptt 
一个提供修改前序树遍历(MPTT)算法实现的PHP库
什么是修改前序树遍历
MPTT是一种在关系数据库中存储层次数据(如类别及其子类别)的快速算法。这是我们大多数人都有过处理的问题,我们通常使用邻接表来处理,其中表中的每个条目都包含一个指向其父级的指针,随着每级添加更多的查询需要运行以获取子树记录,性能会自然下降。
修改前序树遍历算法的目标是使检索操作非常高效。使用它,您只需执行两个查询即可从数据库中获取任意子树。第一个查询用于获取子树的根节点的详细信息,而第二个查询用于获取根节点的所有子节点和孙节点。
这种效率的代价是更新、删除和插入记录的成本更高,因为需要做一些额外的工作来保持树结构始终处于良好状态。此外,由于算法的特性,修改前序树遍历方法比邻接表方法更不直观。
有关修改前序树遍历方法的更多信息,请阅读这篇优秀的文章在数据库中存储层次数据。
什么是Zebra Mptt
Zebra Mptt是一个PHP库,它提供了修改前序树遍历算法的实现,使得在PHP应用程序中实现MPTT算法变得容易。
它提供在树中的任何位置添加节点、删除节点、移动和复制节点以及检索有关节点各种信息的方法。
Zebra Mptt使用表锁确保数据库完整性始终得到保留,并且并发MySQL会话不会损害数据完整性。此外,Zebra Mptt使用一种缓存机制,结果是在脚本执行期间,无论类型如何,或检索操作的次数如何,数据库只被读取一次。
特性
- 提供在树中的任何位置添加节点、删除节点、移动和复制节点以及检索有关节点各种信息的方法
- 使用缓存机制,结果是在脚本执行期间,无论类型如何,或检索操作的次数如何,数据库只被读取一次
- 使用表锁确保数据库完整性始终得到保留,并且并发MySQL会话不会损害数据完整性
- 使用mysqli扩展
- 具有出色的文档
- 代码注释详尽,当PHP的错误报告级别设置为E_ALL时,不会生成警告/错误/通知。
📔 文档
查看优秀的文档!
🎂 支持此项目的发展
您的支持非常宝贵,它让我有动力继续开源项目的工作。如果您喜欢这个项目,请点击页面顶部的星形按钮给它点赞。如果您愿意,还可以通过PayPal给我买杯咖啡,或者成为赞助商。 感谢您的支持! 🎉
需求
PHP 5.0.0+,MySQL 4.1.22+
安装
您可以通过Composer安装Zebra Mptt。
# get the latest stable release composer require stefangabos/zebra_mptt # get the latest commit composer require stefangabos/zebra_mptt:dev-master
或者您可以通过下载最新版本,解压,然后将其包含到您的项目中手动安装。
require_once 'path/to/Zebra_Mptt.php';
安装MySQL表
注意名为install的目录中包含一个名为mptt.sql的文件。此文件包含用于创建类存储数据的表的SQL代码。使用您首选的MySQL管理器(如phpMyAdmin或出色的Adminer)导入或执行SQL代码到您选择的数据库中。
如何使用
// include the Zebra_Mptt class // (you don't need this if you are using Composer) require 'path/to/Zebra_Mptt.php'; // instantiate a new object $mptt = new Zebra_Mptt(); // populate the table // add 'Food' as a topmost node $food = $mptt->add(0, 'Food'); // 'Fruit' and 'Meat' are direct descendants of 'Food' $fruit = $mptt->add($food, 'Fruit'); $meat = $mptt->add($food, 'Meat'); // 'Red' and 'Yellow' are direct descendants of 'Fruit' $red = $mptt->add($fruit, 'Red'); $yellow = $mptt->add($fruit, 'Yellow'); // add a fruit of each color $cherry = $mptt->add($red, 'Cherry'); $banana = $mptt->add($yellow, 'Banana'); // add two kinds of meat $mptt->add($meat, 'Beef'); $mptt->add($meat, 'Pork'); // move 'Banana' to 'Meat' $mptt->move($banana, $meat); // get a flat array of descendants of 'Meat' $mptt->get_descendants($meat); // get a multidimensional array (a tree) of all the data in the database $mptt->get_tree();