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

Как преобразовать массив в дерево, если известны глубины вложенности элементов?

Есть массив:

[
    [
        'depth' => 0,
        'children' => []
    ],
    [
        'depth' => 1,
        'children' => []
    ],
    [
        'depth' => 2,
        'children' => []
    ],
    [
        'depth' => 3,
        'children' => []
    ],
    [
        'depth' => 1,
        'children' => []
    ],
    [
        'depth' => 0,
        'children' => []
    ],
    ...
]

где 'depth' => значение глубины для текущего элемента. Значение depth заранее никак не ограниченно, но всегда идет по порядку cверху вниз. Так вот, как из вышеуказанного массива сделать такой:

[
    [
        'depth' => 0,
        'children' => [
            [
                'depth' => 1,
                'children' => [
                    [
                        'depth' => 2,
                        'children' => [
                            [
                                'depth' => 3,
                                'children' => []
                            ]
                        ]
                    ]
                ]
            ],
            [
                'depth' => 1,
                'children' => []
            ]
        ]
    ],
    [
        'depth' => 0,
        'children' => []
    ],
    ...
]
  • Вопрос задан
  • 274 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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($data, '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' ]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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