Как найти корневой элемент?

Есть массив:

$array = [
            0 => [
                "id" => 1,
                "parent" => 0
            ],
            1 => [
                "id" => 2,
                "parent" => 1
            ],
            2 => [
                "id" => 3,
                "parent" => 2
            ],
            3 => [
                "id" => 4,
                "parent" => 2
            ],
            4 =>[
                "id" => 5,
                "parent" => 2
            ],
            5 =>[
                "id" => 6,
                "parent" => 2
            ],
            6 =>[
                "id" => 7,
                "parent" => 1
            ],
            7 =>[
                "id" => 8,
                "parent" => 7
            ],
            8 =>[
                "id" => 9,
                "parent" => 7
            ],
            9 => [
                "id" => 10,
                "parent" => 7
            ],
            10 => [
                "id" => 11,
                "parent" => 7
            ],
            11 => [
                "id" => 12,
                "parent" => 0
            ]
        ];

Своего рода здесь, категория - подкатегория, но вложенность может быть неограниченной. Мне нужно найти корневой элемент для целой ветки. Например для элемента с индексом 3, корневым элементом будет элемент с индексом 0. По факту, передавая функции id абсолютно любой категории, хочу получить один единственный id корневой категории, для все ветки.
Прошу помочь мне с реализацией и объяснением происходящего. Из прочитанного мною, это можно решить как рекурсией так и с помощью while. Но, что вообще делать и как правильно подойди к этому, ума не приложу.

Если можно, опишите пожалуйста, решение этой задачи несколькими путями и попутно растолковав, что и где происходит, ну и какая из реализаций предпочтительнее. Хочу понять как оно работает и устроено.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
0xD34F
@0xD34F
function getRootItem($id, $array) {
  foreach ($array as $item) {
    if ($item['id'] === $id) {
      $parent = $item['parent'];
      return $parent === 0 ? $item : getRootItem($parent, $array);
    }
  }

  return null;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VladimirAndreev
@VladimirAndreev
php web dev
если у дерева одна вершина, я бы сделал реиндекс этого массива в массив вида
ид_элемента => ид_родителя.

в итоге, получаешь ид элемента, извлекаешь родителя, потом его родителя, потом его и так далее, пока не доберешься до элемента, у которого родителем будет 0. в процессе, записывая все ид в массив.

всё...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы