| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Помогите составить дерево |
| Автор: Igor_K 16.4.2008, 21:13 | ||||
| Всем привет! У меня возникли трудности с составлением дерева. Не могу сообразить, ума не хватает :((( Есть массив:
где внутренние массивы имеют вид array(идентификатор, родитель, значение) нужно его преобразовать в массив такого вида:
то есть создать такое от дерево. Только ума не хватает, подскажите пожалуйста! |
| Автор: GZep 16.4.2008, 21:53 |
| Igor_K, тебе нужна функция, которая бы принимала 1й вариант и возвращала второй? |
| Автор: Igor_K 16.4.2008, 22:05 |
| GZep, можно и функцию, можно и на словах обьяснить. |
| Автор: almagnit 16.4.2008, 22:16 |
| Если с операторами РНР у Вас все в порядке, тогда используте алгоритм: 1. Нужно узнать сколько нужно различных массивов для построения дерева, в Вашем случае нужно четыре массива на это указывают их номера "0,1,2,3" в значениях массива arr. 2. Создаем массив с требуемым количеством элементов, либо нужное количество отдельных массивов и присваиваем его n-ой ячейке, либо n-му массиву - элементы массива arr с соответствующими значениями, т.е. в нулевую ячейку, либо в нулевой массив мы добавляем строку 'Элемент №1' и т.д. 3. Формируем массив aarr из полученного промежуточного массива или массивов |
| Автор: Igor_K 16.4.2008, 22:47 | ||||
almagnit, спасибо большое!!!
Только от с этим не очень понял. Допустим получил 4 массива, как их соединить правильно? То есть поместить в нужную позицию. Например, от, получил:
|
| Автор: GZep 16.4.2008, 22:54 |
| Igor_K, что-то мне подсказывает, что для решения вопроса нужно увидеть причину для такой сортировки массива. Может на конкретном примере? (вероятно, может получиться более простой способ решения реальной проблемы). |
| Автор: skyboy 16.4.2008, 23:26 | ||||||||
| в каждом элементе объяви ещё один элемент массива - типа, children(к примеру). тогда будет проще собрать дерево:
после сей операции у тебя получится не совсем то, что ты описал(из-за дополнительных элементов), но по полученной структуре пройтись вполне можно будет. ещё я бы сделал ассоциативный массив(id, parent, name, chidren), а то обращение
понятнее, чем
вот пример вывода:
|
| Автор: SelenIT 17.4.2008, 00:29 | ||||||
Имхо, для исходной задачи так немного нагляднее:
Лучше всего сделать этот массив ассоциативным:
Тогда из самого массива сразу станет ясно, что к чему привязывать skyboy, в первом примере круто повезло, что айдишники идут по порядку, начиная с единицы;) |
| Автор: skyboy 17.4.2008, 00:49 | ||
полный вариант: "круто повезло, что индекс в массиве совпадает со значением id - 1" ;) етественно, лучше было бы, если бы индексом элемента в начальном массиве был бы сам id. тогда бы и единицу не прилось бы вычитать. и если бы элементы юыли бы ассоциативным массивом, было бы удобнее и т.д.. |
| Автор: SelenIT 17.4.2008, 00:54 | ||
Да, именно это я имел в виду |
| Автор: skyboy 17.4.2008, 01:18 | ||
чтоб не париться, можно положить, что исходный массив может быть только таким и модификацию производить собственными силами:
все же, как мне кажется, сортировка в решении будет лишней. у нас и так для ассоциативного массива хеш строится... P.S. Да, мой код похож на код SelenIT'a, но, чесное слово, не плагиатил, а доработал |
| Автор: SelenIT 17.4.2008, 01:34 | ||
Да, вариант с хешем однозначно лучше |
| Автор: Igor_K 17.4.2008, 16:17 |
| Спасибо большое!!!!! Щяс буду пробовать ваши варианты. |
| Автор: Igor_K 17.4.2008, 17:23 | ||
Да, из базы данных. а как ее получить в таком виде? |
| Автор: DeamonShan 17.4.2008, 17:51 | ||
в случае если из БД берется... |
| Автор: DeamonShan 17.4.2008, 18:08 |
| не тестировал... |
| Автор: SelenIT 17.4.2008, 19:06 |
Общий принцип примерно http://forum.vingrad.ru/index.php?showtopic=147526&view=findpost&p=1188785 (вся соль в строке 22;). В том примере дерево строится рекурсивной ф-цией, но можно применить подход skyboyя со ссылками... |
| Автор: Igor_K 18.4.2008, 13:07 |
| SelenIT, Спасибо за помощь!!! Разобрался. DeamonShan, тоже спасибо, но имхо в каждой итерации делать запрос в базу данныых не хочется ;) |
| Автор: Igor_K 18.4.2008, 13:27 |
| Добавьте кто-то всем отписавшимся тут плюсики, у меня постов не хватает спасибо! |
| Автор: fics 30.3.2009, 23:13 | ||
| Да, из базы данных. а как ее получить в таком виде? сразу из базы и стройте, что никто рекурсией пользоваться не умеет? кусочек из одного моего класса. $node["level"] - дополнительное поля уровня вложенности сразу в сессию пишу чтобы не ганять такой тяжелый скрипт
|
| Автор: Igor_K 3.5.2009, 15:52 |
| fics, такой подход не очень. 100 вложений - 100 запросов. Опять я вернулся к этому вопросу. Тему создал по этому поводу получения данных из таблицы http://forum.vingrad.ru/forum/topic-257734.html Вернулся к этому вопросу спустя год, не довел тогда роботу до конца. |
| Автор: MoLeX 4.5.2009, 05:34 |
нечего страшного. можно же запускать кроном отдельный скрипт и писать результат в файл который потом будет линковаться к сайту. |
| Автор: LittleFuntik 16.6.2009, 00:39 |
| Вот держи мое решение, http://forum.vingrad.ru/forum/topic-263175/kw-php-list-treeview.html!!! И всего-лишь ОДИН ЗАПРОС к БД |
| Автор: capitan 11.9.2009, 12:51 |
| Недавно как раз работал с деревом каталога. Из всех вариантов выбрал, как считаю, самый оптимальный. "Дерево каталогов NESTED SETS (вложенные множества) и управление им " http://www.getinfo.ru/article610.html Все остальные варианты хороши на маленьких объёмах. При польших объёмах, скрипты еле ворочаются. |
| Автор: deperoff 12.2.2012, 12:01 | ||
Вот http://php-include.ru/stati/ierarkhicheskoe-derevo-na-php)) |
| Автор: xPchelkiNx 9.8.2012, 16:01 | ||||
Да, из базы данных. а как ее получить в таком виде? и мне это интересно!!! |
| Автор: Genn 26.8.2012, 22:45 |
| эта структура таблицы легко реализуется id id_parent name потом foreach и всех делов |