С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 1
Регистрация: 12.02.2013
Сообщений: 17

Дайте пожалуйста идею, как вывести дерево

30.08.2013, 23:19. Показов 1069. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается понять, как правильно выводить.

Есть массив: $ref[$a][$b], где $[a] - порядковый номер набора значений, $b - сами значения.
В нём нам передают дерево (структуру подразделений в организации).
Выглядит примерно так:
PHP
1
2
3
4
5
$ref[1] = Array ( [name] => "Бухгалтерия" [id] => "a100" [level] => 1 [parent_id] => 0);
$ref[2] = Array ( [name] => "Типография" [id] => "a101" [level] => 1 [parent_id] => 0);
$ref[3] = Array ( [name] => "повара" [id] => "a102" [level] => 3 [parent_id] => "a108");
$ref[4] = Array ( [name] => "Бухгалтера" [id] => "a103" [level] => 2 [parent_id] => "a100");
$ref[5] = Array ( [name] => "Верстальщики" [id] => "a104" [level] => 2 [parent_id] => "a223");
и т.д.
здесь принцип построения массива:
name - название подразделения
id - уникальный id конкретной записи
level - уровень отдаления от "ствола" дерева, может быть до 20!
parent_id - идентификатор непосредственно родительской ветки (ячейка id родителя)
Никакого порядка, всё перемешано.


задача - вывести в браузер дерево подразделений, с ответвлением от каждого родительского подразделения его внутренних подразделений. Например:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Бухгалтерия
-Прочие сотрудники бухгалтерии
--программисты
--повара
-Бухгалтера
 
Типография
-Печатники
-Верстальщики
--Верстальщики заглавных букв
--Верстальщики цифр
---Верстальщики римских цифр
---Верстальщики арабских цифр
--Верстальщики строчных букв
Здесь в бухгалтерии есть два основных отдела: 1. Бухгалтера. 2. Прочие сотрудники бухгалтерии.
Бухгалтера далее не разделяются на подразделения, а "прочие сотрудники" разделяются на поваров и программистов.

Пытаюсь делать например так:
PHP
1
2
3
4
5
6
7
8
for($x=0;$x<count($ref);$x++){ //перебираем все элементы массива
   if($ref[$x]['level']==1){ //если уровень первый
      echo $ref[$x]['name']."<br>"; //выводим название подразделения
      for($y=0;$y<count($ref);$y++){ //запускаем ещё цикл, чтобы выбрать все дочерние элементы этого подразделения
         if($ref[$y]['parent_id'] == $ref[$x]['id']) echo "-".$ref[$y]['name']."<br>"; //выводим дочерние элементы второго уровня. здесь и есть главная проблема
      }
   }
}
В результате мы получим:

HTML5
1
2
3
4
5
6
7
Бухгалтерия
-Прочие сотрудники бухгалтерии
-Бухгалтера
 
Типография
-Печатники
-Верстальщики
Но нам же надо, чтобы дерево "ветвилось" и дальше. Чтобы получить не только второй, но и третий и т.д. уровни надо вставить в месте, где "здесь и есть главная проблема", ещё кучу вложенных циклов - по количеству уровней вложенности. Но это же неправильно? Надо подразделения сгруппировать по родителю, а не вывести по уровням.

Может быть, как-нибудь предварительно обработать массив $ref? Или более умно распределить циклы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.08.2013, 23:19
Ответы с готовыми решениями:

Пожалуйста дайте идею для создания не сложнее средней проги новичку
мне 16 ну устал уже писать браузеры и &quot;играть&quot; с ветвлениями и буттонами.Но не могу придумать чем пока заняться.а создать серьезную...

Дайте направление, как осуществить идею
Всем привет, захотелось сделать такую штучку: Например, в 1 картошине 10 ломтиков картошки, в 2 пучках листьев 9 листочков, 1 салат...

Дайте идею написания программы
Доброго времени суток! Нужно срочно написать программу, но она должна быть &quot;Экспертной системой&quot;. У меня вообще нет идей, а уже надо...

2
99 / 99 / 27
Регистрация: 26.01.2012
Сообщений: 342
Записей в блоге: 1
31.08.2013, 01:23
Если перебирать, то кол-во циклов пропорционально числу уровней вложенности, т.к. их может быть много и заранее не известно, то используется рекурсия, покапайте в ее сторону, если не получится напишу как.
1
1 / 1 / 1
Регистрация: 12.02.2013
Сообщений: 17
31.08.2013, 18:58  [ТС]
Спасибо большое. Всё получилось по вашей подсказке.
Сделали так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     function recurs($id,$ref){
            if(!isset($e)) $e="";
            for($b=0;$b<count($ref);$b++){      //перебираем массив, ищем дочерние элементы
                if($ref[$b]['parent_id']==$id){ //если дочерний элемент нашелся
                    for($i=1;$i<$ref[$b]['level'];$i++) $e.= "-"; //выводим черточки, количество соответствует уровню
                    $e .= $ref[$b]['name']."<br>".recurs($ref[$b]['id'],$ref); //выводим имя и заново запускаем рекурсивную функцию, уже для этого элемента
                }
            }
            return $e;
        }
 
 
        for($a=0;$a<count($ref);$a++){
            if($ref[$a]['level']==1){ //выводим деревья по первому уровню
                echo $ref[$a]['name']."<br>";
                echo recurs($ref[$a]['id'],$ref); //вывод рекурсивной функции, в параметрах передаём id и сам массив
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2013, 18:58
Помогаю со студенческими работами здесь

Дайте идею по реализации программы на Qt
Здравствуйте! Хочу сделать программу, чтобы она получала ключи для антивируса из интернета! Как вот ее лучше реализовать, у меня...

Дайте какую-то идею для проекта
Приветствую Вас форумчани. Я решил создать какой-то свой проект по С++, но не могу определится с темой. Многие говорят, что при создании...

Мопогите написать программу или хотябы дайте идею
На площині задано множину n точок,n&lt;=300 , і окрему точку d . Розробити програму, яка підраховує кількість різних точок a,b,c із...

Дайте пожалуйста совет - как построить такой график?
Добрый день! Подскажите. В данной программе я не силен и поэтому имеются множество вопросов. Суть вопроса: имеется какое-то нелинейное...

Укажите пожалуйста на ошибки и дайте совет как сделать нормализацию
Укажите пожалуйста на ошибки и дайте совет как сделать нормализацию.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru