boardfy/mptt-multi-independent-tree

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

3.1 2018-08-21 12:46 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:36:52 UTC


README

Mptt_MultiTree

一个提供修改前序树遍历算法实现,并支持多独立树的PHP库

什么是修改前序树遍历

MPTT是一种快速算法,用于在关系数据库中存储层次数据(如分类及其子分类)。这是我们大多数人都曾遇到过的问题,并且我们使用了一个邻接表来处理,其中表中的每个项都包含对其父项的指针,并且随着每个级别的增加,性能会自然下降,因为需要运行更多查询来获取记录的子树。

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

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

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

什么是Mptt_MultiIndependentTree

Mptt_MultiIndependentTree 是一个PHP库,由 stefangabos 的 Zebra_Mptt 衍生而来,提供了修改前序树遍历算法的实现,使得在PHP应用程序中实现MPTT算法变得容易。

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

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

特性

  • 允许使用同一张表来存储独立树,从而加快独立树结构的操作(即:每个客户端一个树)。
  • 提供在树中任何位置添加节点、删除节点、移动和复制节点以及检索有关节点各种信息的方法
  • 使用缓存机制,无论检索操作的类型或数量如何,数据库在脚本执行期间都只读取一次!
  • 使用事务,确保数据库完整性始终得到保留,并且并发MySQL会话不会破坏数据完整性
  • 使用mysqli扩展
  • 代码注释详尽,当PHP的错误报告级别设置为E_ALL时,不会产生警告/错误/通知

需求

PHP 5.0.0+,MySQL 4.1.22+

安装

下载最新版本,解压缩,并在您的项目中加载

require_once 'Mptt_MultiIndependentTree.php';

使用Composer安装

您可以通过Composer安装Mptt_MultiIndependentTree

# get the latest stable release
composer require boardfy/Mptt_MultiIndependentTree

# get the latest commit
composer require boardfy/Mptt_MultiIndependentTree:dev-master

安装MySQL表

注意一个名为install的目录,其中包含一个名为mptt.sql的文件。此文件包含用于创建存储其数据的表的SQL代码。使用您首选的MySQL管理器(如phpMyAdmin或出色的Adminer)导入或执行SQL代码,并将其导入您选择的数据库中。

如何使用

// include the Mptt_MultiIndependentTree class
require 'path/to/Mptt_MultiIndependentTree.php';

// instantiate a new object
$mptt = new Mptt_MultiIndependentTree();

// 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_children($meat);

// get a multidimensional array (a tree) of all the data in the database
$mptt->get_tree();