Получить массив выделенных элементов и его потомков - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив массивов 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

Что мне нужно сделать сейчас: для заданного списка идентификаторов вернуть все элементы с предоставленными идентификаторами и их потомками (независимо от того, сколько уровней).Например, если я получу массив с [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 голосов
/ 07 февраля 2019

Я изменил методы, так как довольно просто создать список из одного рекурсивного метода.Это также передает $elements, так что его можно легко протестировать.

Метод может принимать либо идентификатор, либо массив идентификаторов, если это один идентификатор, он делает его массивом, чтобы он мог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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...