stefangabos/zebra_mptt

一个提供修改前序树遍历算法实现的PHP库

资助包维护!
stefangabos

2.3.7 2022-04-26 20:21 UTC

This package is auto-updated.

Last update: 2024-08-29 03:20:54 UTC


README

zebrajs

Zebra Mptt  Tweet

一个提供修改前序树遍历(MPTT)算法实现的PHP库

Latest Stable Version Total Downloads Monthly Downloads Daily Downloads License

什么是修改前序树遍历

MPTT是一种在关系数据库中存储层次数据(如类别及其子类别)的快速算法。这是我们大多数人都有过处理的问题,我们通常使用邻接表来处理,其中表中的每个条目都包含一个指向其父级的指针,随着每级添加更多的查询需要运行以获取子树记录,性能会自然下降。

修改前序树遍历算法的目标是使检索操作非常高效。使用它,您只需执行两个查询即可从数据库中获取任意子树。第一个查询用于获取子树的根节点的详细信息,而第二个查询用于获取根节点的所有子节点和孙节点。

这种效率的代价是更新、删除和插入记录的成本更高,因为需要做一些额外的工作来保持树结构始终处于良好状态。此外,由于算法的特性,修改前序树遍历方法比邻接表方法更不直观。

有关修改前序树遍历方法的更多信息,请阅读这篇优秀的文章在数据库中存储层次数据

什么是Zebra Mptt

Zebra Mptt是一个PHP库,它提供了修改前序树遍历算法的实现,使得在PHP应用程序中实现MPTT算法变得容易。

它提供在树中的任何位置添加节点、删除节点、移动和复制节点以及检索有关节点各种信息的方法。

Zebra Mptt使用表锁确保数据库完整性始终得到保留,并且并发MySQL会话不会损害数据完整性。此外,Zebra Mptt使用一种缓存机制,结果是在脚本执行期间,无论类型如何,或检索操作的次数如何,数据库只被读取一次。

特性

  • 提供在树中的任何位置添加节点、删除节点、移动和复制节点以及检索有关节点各种信息的方法
  • 使用缓存机制,结果是在脚本执行期间,无论类型如何,或检索操作的次数如何,数据库只被读取一次
  • 使用表锁确保数据库完整性始终得到保留,并且并发MySQL会话不会损害数据完整性
  • 使用mysqli扩展
  • 具有出色的文档
  • 代码注释详尽,当PHP的错误报告级别设置为E_ALL时,不会生成警告/错误/通知。

📔 文档

查看优秀的文档

🎂 支持此项目的发展

您的支持非常宝贵,它让我有动力继续开源项目的工作。如果您喜欢这个项目,请点击页面顶部的星形按钮给它点赞。如果您愿意,还可以通过PayPal给我买杯咖啡,或者成为赞助商。 感谢您的支持! 🎉

Star it on GitHub Donate

需求

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();