PHPackages                             lambert/tree-shape - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. lambert/tree-shape

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

lambert/tree-shape
==================

A simple way to generate a tree structure.

1.0.0(8y ago)186.0k↓50%2MITPHPPHP &gt;=5.6

Since Jan 10Pushed 8y ago1 watchersCompare

[ Source](https://github.com/8090Lambert/EasyTree)[ Packagist](https://packagist.org/packages/lambert/tree-shape)[ RSS](/packages/lambert-tree-shape/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (2)Versions (2)Used By (0)

EasyTree
========

[](#easytree)

> 生成树形结构的简单方式

Feature
-------

[](#feature)

有Relation\_key的关系数据，都可以生成树状的结构

Install
-------

[](#install)

```
$ composer require lambert/tree-shape

```

RequireMent
-----------

[](#requirement)

- PHP &gt;= 5.6

Usage
-----

[](#usage)

```
use Lambert\TreeShape\Manager;

$category = [
    ['id' => 1, 'name' => '节点1', 'pid' => 0],
    ['id' => 2, 'name' => '节点2', 'pid' => 0],
    ['id' => 3, 'name' => '节点3', 'pid' => 1],
    ['id' => 4, 'name' => '节点4', 'pid' => 1],
];

// Start build
$manager = Manager::buildTree($category, 'pid');
$tree = $manager->all();

```

生成后：

```
Array
(
    [1] => Lambert\TreeShape\Tree Object
        (
            [childrenIds:protected] => Array
                (
                    [0] => 3
                    [1] => 4
                )

            [recursionChildrenIds:protected] =>
            [currentNode:protected] => Lambert\TreeShape\Node Object
                (
                    [data:protected] => Array
                        (
                            [id] => 1
                            [name] => 节点1
                            [pid] => 0
                        )

                )

            [leftTree:protected] =>
            [rightTree:protected] => Array
                (
                    [3] => Lambert\TreeShape\Tree Object
                        (
                            [childrenIds:protected] =>
                            [recursionChildrenIds:protected] =>
                            [currentNode:protected] => Lambert\TreeShape\Node Object
                                (
                                    [data:protected] => Array
                                        (
                                            [id] => 3
                                            [name] => 节点3
                                            [pid] => 1
                                        )

                                )

                            [leftTree:protected] => Lambert\TreeShape\Tree Object
 *RECURSION*
                            [rightTree:protected] =>
                        )

                    [4] => Lambert\TreeShape\Tree Object
                        (
                            [childrenIds:protected] =>
                            [recursionChildrenIds:protected] =>
                            [currentNode:protected] => Lambert\TreeShape\Node Object
                                (
                                    [data:protected] => Array
                                        (
                                            [id] => 4
                                            [name] => 节点4
                                            [pid] => 1
                                        )

                                )

                            [leftTree:protected] => Lambert\TreeShape\Tree Object
 *RECURSION*
                            [rightTree:protected] =>
                        )

                )

        )

    [2] => Lambert\TreeShape\Tree Object
        (
            [childrenIds:protected] =>
            [recursionChildrenIds:protected] =>
            [currentNode:protected] => Lambert\TreeShape\Node Object
                (
                    [data:protected] => Array
                        (
                            [id] => 2
                            [name] => 节点2
                            [pid] => 0
                        )

                )

            [leftTree:protected] =>
            [rightTree:protected] =>
        )

)

```

Methods
-------

[](#methods)

- 查找某个Tree

```
$tree = $manager->findTree('name', '子节点1');

Lambert\TreeShape\Tree Object
(
    [childrenIds:protected] => Array
        (
            [0] => 3
            [1] => 4
        )

    [recursionChildrenIds:protected] =>
    [currentNode:protected] => Lambert\TreeShape\Node Object
        (
            [data:protected] => Array
                (
                    [id] => 1
                    [name] => 节点1
                    [pid] => 0
                )

        )

    [leftTree:protected] =>
    [rightTree:protected] => Array
        (
            [3] => Lambert\TreeShape\Tree Object
                (
                    [childrenIds:protected] =>
                    [recursionChildrenIds:protected] =>
                    [currentNode:protected] => Lambert\TreeShape\Node Object
                        (
                            [data:protected] => Array
                                (
                                    [id] => 3
                                    [name] => 节点3
                                    [pid] => 1
                                )

                        )

                    [leftTree:protected] => Lambert\TreeShape\Tree Object
*RECURSION*
                    [rightTree:protected] =>
                )

            [4] => Lambert\TreeShape\Tree Object
                (
                    [childrenIds:protected] =>
                    [recursionChildrenIds:protected] =>
                    [currentNode:protected] => Lambert\TreeShape\Node Object
                        (
                            [data:protected] => Array
                                (
                                    [id] => 4
                                    [name] => 节点4
                                    [pid] => 1
                                )

                        )

                    [leftTree:protected] => Lambert\TreeShape\Tree Object
*RECURSION*
                    [rightTree:protected] =>
                )

        )

)

```

- 获取当前树的左、右子树

```
$leftTree = $tree->getLeftTree();
$rightTree = $tree->getRightTree();
Lambert\TreeShape\Tree Object
(
    [childrenIds:protected] => Array
        (
            [0] => 3
            [1] => 4
        )

    [recursionChildrenIds:protected] =>
    [currentNode:protected] => Lambert\TreeShape\Node Object
        (
            [data:protected] => Array
                (
                    [id] => 1
                    [name] => 节点1
                    [pid] => 0
                )

        )

    [leftTree:protected] =>
    [rightTree:protected] =>
)

**注意：获取右子树时，根据自己数据类型的关系，多个右子树的话，会返回Array**

```

- 获取节点属性

```
继承了SPL的ArrayAccess，可以使用数组或属性的方式访问

$node = $tree->getCurrentNode();

$node['name'] or $node->name;   // 节点1

$node['id'] or $node->id;   // 1
...

```

License
-------

[](#license)

MIT

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity32

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

3051d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/82957425cc788a87523b60c77b35c38e5b152c40e7bb87735bf9410d29520761?d=identicon)[juzhenbin](/maintainers/juzhenbin)

---

Top Contributors

[![8090Lambert](https://avatars.githubusercontent.com/u/10015604?v=4)](https://github.com/8090Lambert "8090Lambert (5 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/lambert-tree-shape/health.svg)

```
[![Health](https://phpackages.com/badges/lambert-tree-shape/health.svg)](https://phpackages.com/packages/lambert-tree-shape)
```

###  Alternatives

[optimistdigital/nova-sortable

This Laravel Nova package allows you to reorder models in a Nova resource's index view using drag &amp; drop.

2872.1M6](/packages/optimistdigital-nova-sortable)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
