rgilyov/array-tree-walker

非常简单的方式解析具有树结构的数组

1.0.0 2017-08-02 16:30 UTC

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');