获取所选元素及其子元素的数组

时间:2019-02-07 16:28:01

标签: php arrays tree

我有一个由外部系统以以下格式返回的数组的php数组

$elements = [
    [
        'id' => 1,
        'name' => 'Element 1',
        'parent_id' => 0
    ],
    [
        'id' => 2,
        'name' => 'Element 2',
        'parent_id' => 0
    ],
    [
        'id' => 3,
        'name' => 'Element 3',
        'parent_id' => 1
    ],
    [
        'id' => 4,
        'name' => 'Element 4',
        'parent_id' => 1
    ],
    [
        'id' => 5,
        'name' => 'Element 5',
        'parent_id' => 1
    ],
    [
        'id' => 6,
        'name' => 'Element 6',
        'parent_id' => 2
    ],
    [
        'id' => 7,
        'name' => 'Element 7',
        'parent_id' => 2
    ],
    [
        'id' => 8,
        'name' => 'Element 8',
        'parent_id' => 3
    ],
    [
        'id' => 9,
        'name' => 'Element 9',
        'parent_id' => 3
    ],
    [
        'id' => 10,
        'name' => 'Element 10',
        'parent_id' => 3
    ]
];

如果有帮助,这种“翻译”成树的结构看起来像这样:

  • 元素1
    • 元素3
      • 元素8
      • 元素9
      • 元素10
    • 元素4
    • 元素5
  • 元素2
    • 元素6
    • 元素7

我现在需要做的是:对于给定的ID列表,返回具有提供的ID及其子元素的所有元素(无论有多少级)。例如,如果我收到一个带有[2, 3]的数组,则输出应为[2, 3, 7, 8, 9, 10]

我创建了一个函数来基于数组生成树结构:

    public function createTree($parent = 0)
    {
        // This returns all the direct children of $parent
        $elements = filterByParent($parent); 
        $categories = [];
        $i = 0;
        foreach ($elements as $element) {
            $categories[$i] = $element;
            $categories[$i]['children'] = createTree($element['id']);
            $i++;
        }

        return $categories;
    }

但是我现在不知道该怎么做。

任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

我已经更改了方法,因为从单个递归方法创建列表非常容易。它还会传入$elements,以便可以轻松对其进行测试。

该方法可以采用一个ID或ID的数组,如果它是单个ID,则将其设为一个数组,以便可以foreach()遍历列表。然后,它仅针对每个元素进行检查,并将其添加到工作列表中。然后调用相同的方法查找其他子项。

function dependants ( $ids, $elements )  {
    if ( !is_array($ids) )   {
        $ids = [$ids];
    }
    $deps = $ids;
    foreach ( $ids as $id ) {
        foreach ( $elements as $element )   {
            if ( $element['parent_id'] == $id ) {
                $deps = array_merge($deps, dependants($element['id'], $elements));
            }
        }
    }
    return $deps;
}
print_r(dependants([2,3], $elements ));

给予

Array
(
    [0] => 2
    [1] => 3
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 9
    [6] => 10
)