Задать вопрос
@JohnxFFF

Как построить дерево?

Добрый день, уже час залипаю, пытаясь придумать как адекватно построить дерево.

есть массив:
Array
(
    [4] => Array
        (
            [id] => 4
            [name] => Корень 1
            [lft] => 1
            [rgt] => 8
            [depth] => 0
            [tree] => 4
        )
    [5] => Array
        (
            [id] => 5
            [name] => Второй уровень
            [lft] => 2
            [rgt] => 5
            [depth] => 1
            [tree] => 4
        )

    [7] => Array
        (
            [id] => 7
            [name] => Третий уровень
            [lft] => 3
            [rgt] => 4
            [depth] => 2
            [tree] => 4
        )
    [6] => Array
        (
            [id] => 6
            [name] => Второй уровень (2)
            [lft] => 6
            [rgt] => 7
            [depth] => 1
            [tree] => 4
        )
    [8] => Array
        (
            [id] => 8
            [name] => Корень 2
            [lft] => 1
            [rgt] => 2
            [depth] => 0
            [tree] => 8
        )
)


Как построить дерево ?
[
 name => Корень 1
     children => [
        [
            name => Второй уровень,
            children => [
                name => Третий уровень,
            ],
        ],
        [
            name => Второй уровень (2),
        ]
    ],
],
[
  name => Корень 2
]
=====================================

Корень 1
- Второй уровень
- - Третий уровень
- Второй уровень(2)

Корень 2


Скорее всего нужно использовать рекурсию, подтолкните пожалуйста, не могу придумать как нормально формировать, на любой вложенности
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • OTUS
    PHP Developer. Professional
    5 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F
function createTree($data, $levelKey, $childrenKey) {
  $tree = [];

  foreach ($data as $n) {
    $arr = &$tree;

    for ($level = $data[0][$levelKey]; $n[$levelKey] > $level; $level++) {
      $arr = &$arr[count($arr) - 1][$childrenKey];
    }

    $arr[] = $n + [ $childrenKey => [] ];
  }

  return $tree;
}

$tree = createTree($arr, 'depth', 'children');

или

function createTree($data, $params = []) {
  $levelKey = $params['levelKey'] ?? 'level';
  $childrenKey = $params['childrenKey'] ?? 'children';

  $root = [];
  $parents = [ $data[0][$levelKey] => &$root ];

  foreach ($data as $n) {
    $n[$childrenKey] = [];
    $level = $n[$levelKey];
    $p = &$parents[$level];
    $p[] = $n;
    $parents[-~$level] = &$p[~-count($p)][$childrenKey];
  }

  return $root;
}

$tree = createTree($arr, [ 'levelKey' => 'depth' ]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы