@artem_atlas

Как вывести древовидную структуру из массива?

У меня есть переменная $block в которой содержится массив элементов. Например:
0 => "id" => 1
"sub_id" => null
"name" => "name1"
1 => "id" => 2
"sub_id" => 1
"name" => "name2"
2 => "id" => 3
"sub_id" => 1
"name" => "name3"
3 => "id" => 4
"sub_id" => null
"name" => "name4"
В результате я должен получить (для примера):
- name1
-- name2
-- name3
- name4
sub_id указывает на id родительского элемента (в результате можно получить очень большую друвовидную структуру).
Меня интересует как можно рекурсивно вывести такую древовидную структуру (учитывая что слои могут доходить до нескольких десятков).
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
@dzhebrak
$arr = [
	['id' => 1, 'sub_id' => null, 'name'=> 'name1'],
	['id' => 2, 'sub_id' => 1,    'name'=> 'name2'],
	['id' => 3, 'sub_id' => 1,    'name'=> 'name3'],
	['id' => 4, 'sub_id' => null, 'name'=> 'name4'],
	['id' => 5, 'sub_id' => 2,    'name'=> 'name5'],
	['id' => 6, 'sub_id' => 4,    'name'=> 'name6'],
];

/* https://stackoverflow.com/a/28429487  */
function buildTree(array &$elements, $parentId = 0) {

    $branch = array();

    foreach ($elements as &$element) {

        if ($element['sub_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[$element['id']] = $element;
            unset($element);
        }
    }
    return $branch;
}

function printTree(array $arr, $level=1) {
	foreach ($arr as $k => $v) {
		print(str_repeat('-', $level) . $v['name'] ."\n");
		if(isset($v['children']) && is_array($v['children'])) {
			printTree($v['children'], $level + 1);
		}
	}
}

printTree(buildTree($arr));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
anton_reut
@anton_reut
Начинающий веб-разработчик
Из простого - проверять является ли переменная массивом или строкой, если массив то делаем foreach пока не доберёмся до строки, одновременно счетчиком считаем количество итераций чтобы понимать какой уровень получился у строки.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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