matejlauko / tree
此包已被废弃,不再维护。没有建议的替代包。
一个基本但灵活的php树数据结构和流畅的树构建实现。基于 nicmart/Tree 分支
v0.2.5
2015-02-10 19:14 UTC
Requires
- php: >=5.4
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