此包已被废弃,不再维护。没有建议的替代包。

一个基本但灵活的php树数据结构和流畅的树构建实现。基于 nicmart/Tree 分支

v0.2.5 2015-02-10 19:14 UTC

This package is not auto-updated.

Last update: 2022-09-06 23:23:54 UTC


README

这是 nicmart/tree php 树结构的分支。用于个人项目。

在 Tree 中,您可以找到一个基本但灵活的 php 树数据结构,以及一个实用的 Builder 类,它允许您以流畅的方式构建树。

此包添加了一个 Tree 容器,用于封装节点。

树数据结构

Tree\Node\NodeInterface 接口抽象了树节点的概念。在 Tree 中,一个节点本质上有两个东西:一组子节点(实现了相同的 NodeInterface 接口)和一个值。

另一方面,Tree\Node\Node 为该接口提供了一个直接的实现。

创建节点

use Tree\Node\Node;

$node = new Node('foo');

获取和设置节点的值

每个节点都有一个值属性,可以是任何 php 值。

$node->setValue('my value');
echo $node->getValue(); //Prints 'my value'

添加一个或多个子节点

$child1 = new Node('child1');
$child2 = new Node('child2');

$node
    ->addChild($child1)
    ->addChild($child2);

移除子节点

$node->removeChild($child1);

获取所有子节点的数组

$children = $node->getChildren();

覆盖子节点集

$node->setChildren([new Node('foo'), new Node('bar')]);

移除所有子节点

$node->removeAllChildren();

获取节点是否为叶子节点

叶子节点是没有子节点的节点。

$node->isLeaf();

获取节点是否为子节点

子节点是有父节点的节点。

$node->isChild();

获取节点的父节点

父节点引用由子节点修改方法自动管理

$root->addChild($node = new Node('child'));
$node->getParent(); // Returns $root

获取节点的祖先节点

$root = (new Node('root'))
    ->addChild($child = new Node('child'))
    ->addChild($grandChild = new Node('grandchild'))
;

$grandchild->getAncestors(); // Returns [$root, $child]

相关方法

  • getAncestorsAndSelf 获取包括当前节点在内的节点的所有祖先节点。

获取节点的根节点

$root = $node->root();

获取节点的邻居节点

$root = (new Node('root'))
    ->addChild($child1 = new Node('child1'))
    ->addChild($child2 = new Node('child2'))
    ->addChild($child3 = new Node('child3'))
;

$child2->getNeighbors(); // Returns [$child1, $child3]

相关方法

  • getNeighborsAndSelf 获取当前节点及其邻居。

获取节点的深度

$node->getDepth();

获取节点的树高

$node->getHeight();

构建器

构建器提供了一种方便构建树的方法。它由 Builder 类提供,但你也可以实现自己的构建器,通过实现 BuilderInterface 类。

示例

让我们看看如何构建以下树,其中节点标签代表节点值

       A
      / \
     B   C
        /|\
       D E F
      /|
     G H   

以下是代码

$builder = new Tree\Builder\NodeBuilder;

$builder
    ->value('A')
    ->leaf('B')
    ->tree('C')
        ->tree('D')
            ->leaf('G')
            ->leaf('H')
            ->end()
        ->leaf('E')
        ->leaf('F')
        ->end()
;

$nodeA = $builder->getNode();

示例应该很容易理解,但以下是对上述方法使用的简要说明。

Builder::value($value)

将当前节点的值设置为 $value

Builder::leaf($value)

向当前节点添加一个新的子节点,其值为 $value

Builder::tree($value)

向当前节点添加一个新的子节点,其值为 $value,并将新节点设置为构建器的当前节点。

Builder::end()

返回到调用 tree 方法之前的构建器上下文,即让构建器向上提升一级。

Builder::getNode()

返回当前节点。

树的输出

您可以使用 YieldVisitor 获取树的输出(即前序遍历中的叶节点列表)。例如,如果 $node 是上述构建的树,则

use Tree\Visitor\YieldVisitor;
$visitor = new YieldVisitor;

$yield = $node->accept($visitor);
// $yield will contain nodes B, G, H, E, F

测试

phpunit