rgilyov / array-tree-walker
非常简单的方式解析具有树结构的数组
1.0.0
2017-08-02 16:30 UTC
Requires
- php: >=5.6
Requires (Dev)
- phpunit/phpunit: 5.7
This package is not auto-updated.
Last update: 2024-09-30 03:03:03 UTC
README
安装
composer require rgilyov/array-tree-walker dev-master
描述
让我们通过一个具有树结构的数组示例来说明
$tree = [ 'name' => 'child', 'parents' => [ 'mother' => [ 'name' => 'mother', 'parents' => [ 'mother' => [ 'name' => 'first grand mother' ], 'father' => [ 'name' => 'first grand father' ] ] ], 'father' => [ 'name' => 'father', 'parents' => [ 'mother' => [ 'name' => 'second grand mother' ], 'father' => [ 'name' => 'second grand father', 'parents' => [ 'mother' => [ 'name' => 'second grand grand mother' ] ] ] ] ] ] ]; $walker = new \RGilyov\ArrayTreeWalker($tree);
要遍历树结构使用 ->
,要获取值使用 ->get('name')
;
echo $walker->parents->mother->parents->father->get('name'); // result: `first grand father`
您也可以这样获取值
echo $walker->parents->mother->parents->father['name']; // result: `first grand father` echo $walker->parents->mother->parents->father->name['name']; // result: `first grand father` echo $walker->parents->mother->parents->father->name->father['name']; // result: null
您还可以指定节点名称,只需将其作为类的构造函数的第二个参数传递即可
$walkerWithNodeName = new \RGilyov\ArrayTreeWalker($tree, 'parents'); echo $walkerWithNodeName->father->father->get('name'); // result: `second grand father` echo $walkerWithNodeName->father->father->mother['name']; // result: 'second grand grand mother' echo $walkerWithNodeName->father->father->mother->mother['name']; // result: null
您还可以在遍历过程中向下和向上遍历树,并修改每个节点
$walker = new \RGilyov\ArrayTreeWalker($tree, 'parents'); /* * If an array will be returned the values for given keys will be rewritten and if keys didn't exist in the node they will be attached */ $walker->walkDown(function ($node, $level, $nodeNumber, $parentNodeNumber) { return [ 'level' => $level, 'node_number' => $nodeNumber, 'parent_node_number' => $parentNodeNumber ]; }); $walker->walkUp(function ($node, $nodeChildren, $parameters, $level, $nodeNumber) { return [ 'super_name' => $node['name'] . ' ' . implode(array_map(function ($child) { return $child['name']; }, $nodeChildren), ' ') ]; });
可用方法列表
$walker->toArray(); $walker->count(); $walker->offsetExists('key'); $walker->offsetUnset('key'); $walker->offsetGet('key'); $walker->offsetSet('key', 'value');