tobento / service-treeable
轻松构建树结构。
1.0.1
2021-06-15 12:23 UTC
Requires
- php: >=8.0
Requires (Dev)
- phpstan/phpstan: ^0.12.89
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.0
README
使用Treeable服务,您可以轻松创建和操作树结构。
目录
入门指南
运行以下命令以添加Treeable服务项目的最新版本。
composer require tobento/service-treeable
需求
- PHP 8.0或更高版本
亮点
- 框架无关,适用于任何项目
- 解耦设计
文档
数组树
Array树创建以下数据结构
use Tobento\Service\Treeable\ArrayTree; $items = [ [ 'name' => 'cars', ], [ 'name' => 'VW', 'parent' => 'cars', ], ]; $items = (new ArrayTree($items, 'name', 'parent'))->create(); Array ( [cars] => Array ( [name] => cars [parent] => [level] => 0 [parentItem] => [children] => Array ( [VW] => Array ( [name] => VW [parent] => cars [level] => 1 [parentItem] => Array ( [name] => cars [parent] => [level] => 0 [parentItem] => ) ) ) ) )
根据您的数组需求更改项目键。
use Tobento\Service\Treeable\ArrayTree; $tree = new ArrayTree($items, 'id', 'parent_id', 'level', 'children', 'parentItem');
排序数组项。
use Tobento\Service\Treeable\ArrayTree; // sort by array key. $items = (new ArrayTree($items, 'name', 'parent'))->sort('name')->create(); // sort by callable. $items = (new ArrayTree($items, 'name', 'parent')) ->sort(fn ($a, $b) => $a['name'] > $b['name']) ->create();
过滤数组项。
use Tobento\Service\Treeable\ArrayTree; $items = (new ArrayTree($items, 'name', 'parent')) ->filter(fn($i) => $i['name'] === 'cars') ->create();
遍历数组项。
在each()方法中,树数据结构已经构建,因此您可以使用此信息。
use Tobento\Service\Treeable\ArrayTree; $items = (new ArrayTree($items, 'name', 'parent')) ->each(function($item, $level) { if ($level >= 1) { return null; } $parentItem = $item['parentItem']; return $item; }) ->create();
从特定树项遍历父数组项。
use Tobento\Service\Treeable\ArrayTree; $items = (new ArrayTree($items, 'name', 'parent')) ->parents('BMW', function($item) { $item['active'] = true; return $item; }) ->create();
树
使用Tree类,项目必须实现Treeable接口。
use Tobento\Service\Treeable\Tree; use Tobento\Service\Treeable\Treeable; use Tobento\Service\Treeable\TreeableAware; /** * Item */ class Item implements Treeable { use TreeableAware; /** * Create a new Item * * @param string * @param null|string */ public function __construct( protected string $text, protected ?string $parent = null, ) {} /** * Get the tree id * * @return string|int */ public function getTreeId(): string|int { return $this->text; } /** * Get the tree parent * * @return null|string|int */ public function getTreeParent(): null|string|int { return $this->parent; } public function text(): string { return $this->text; } } $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $items = $tree->create();
排序项目
use Tobento\Service\Treeable\Tree; $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $tree->sort(fn ($a, $b) => $a->text() <=> $b->text()); $items = $tree->create();
过滤项目
use Tobento\Service\Treeable\Tree; $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $tree->filter(fn($i) => $i->text() === 'cars'); $items = $tree->create();
遍历每个项目
在each()方法中,树数据结构已经构建,因此您可以使用此信息。
use Tobento\Service\Treeable\Tree; $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $tree->each(function($item, $level) { if ($level >= 1) { return null; } //$item->getTreeLevel(); return $item; }); $items = $tree->create();
从特定树项遍历父项目。
use Tobento\Service\Treeable\Tree; $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $tree->parents('VW', function($item) { $item->active(true); return $item; }); $items = $tree->create();
遍历器
遍历数组树项。
use Tobento\Service\Treeable\Traverser; use Tobento\Service\Treeable\ArrayTree; $items = [ [ 'name' => 'cars', ], [ 'name' => 'VW', 'parent' => 'cars', ], [ 'name' => 'BMW', 'parent' => 'cars', ], ]; $tree = new ArrayTree($items, 'name', 'parent'); // change the children key if needed. $html = (new Traverser($tree->create(), 'children')) ->before(function($level) { return '<ul>'; }) ->item(function($item, $childrenHtml, $level) { if (!empty($childrenHtml)) { return '<li>'.$item['name'].$childrenHtml.'</li>'; } return '<li>'.$item['name'].'</li>'; }) ->after(function($level) { return '</ul>'; }) ->render();
<ul> <li>cars <ul> <li>VW</li> <li>BMW</li> </ul> </li> </ul>
遍历可树化的项。
use Tobento\Service\Treeable\Traverser; use Tobento\Service\Treeable\Tree; $tree = new Tree([ new Item('cars'), new Item('VW', 'cars'), new Item('BMW', 'cars'), ]); $html = (new Traverser($tree->create())) ->before(function($level) { return '<ul>'; }) ->item(function($item, $childrenHtml, $level) { if (!empty($childrenHtml)) { return '<li>'.$item->text().$childrenHtml.'</li>'; } return '<li>'.$item->text().'</li>'; }) ->after(function($level) { return '</ul>'; }) ->render();
<ul> <li>cars <ul> <li>VW</li> <li>BMW</li> </ul> </li> </ul>