Изграждане на йерархично дърво с PHP и MySQL
Помислете за пример за изграждане на йерархично дърво (в разширена форма) въз основа на информация от база данни с помощта на PHP и MySQL. Ключът към решаването на този проблем е използването на рекурсивна функция. Йерархията на дяловете ще се съхранява в таблица на MySQL база данни.
Екранната снимка по-долу показва тази таблица (каталог):
Йерархичната структура на дяла се съхранява в базата данни MySQLid - първичен ключ на таблицата pid - id на родителската секция
Нека напишем следния PHP скрипт:
1. Файл dbopen.php (отваря връзка с MySQL)
2. Файл Index.php (основен скрипт)
Цялата работа се извършва от рекурсивната функция ShowTree(). Екранната снимка по-долу показва пример за това как работи index.php:
Резултатът от index.phpПримерен проект е приложен: phptree.zip Автор на сценария: Юрий Христофоров
Ако разбирам правилно, тогава с всяка итерация се осъществява достъп до базата данни. Според мен това не е много добра практика. Ако влагането на дървото е голямо, тогава е скъпо ... Що се отнася до мен, по-добре е да извадите всички данни наведнъж и след това да изградите дърво в php според получените данни или да съхранявате дърветата във файл. Ако, например, трябва да създадете меню на сайта, можете да хвърлите всичко в ini или xml или json или yaml файл и след това просто да го рейкнете всичко наведнъж.
Идеята е добра, може ли пример за изпълнение?
Предпочитам начина на конфигурационния файл.. Сега използвам Zend Framework навсякъде. Там има компонент Zend_Config_Writer. Тоест, когато трябва да редактирате конфигурационния файл, използвайте го. И когато трябва да използвате конфигурацията, ние просто вземаме Zend_Config, който извлича готовото дърво от конфигурационния файл под формата на масив. Доколкото знам, достъпът до PHP файл прави повече от достъп до база данниданни .. Въпреки че няма да кажа със сигурност ..
Разбира се, можете да използвате подобни инструменти от други библиотеки .. Основният принцип тук е ...
Ето пример за обработка на резултата от селекция от базата данни: $queryResult = array( array('id' => 1, 'parent_id' => 11, 'page' => 'News_1.1'), array('id' => 2, 'parent_id' => 0, 'page' => 'Индекс '), array('id' => 3, 'parent_id' => 17, 'page' => 'News_1.2.1'), array('id' => 5, 'parent_id' => 0, 'page' => 'Новини'), array('id' => 7, 'parent_id' = &g t; 17, 'page' => 'News_1.2.3'), array('id' => 8, 'parent_id' => 17, 'page' => 'News_1.2.2'), array('id' => 9, 'parent_id' => 0, 'page' => 'About'), array('id' => 11, 'parent_id' => 5, 'page' => 'News_1'), array('id' => 17, 'parent_id' => 11, 'page' => 'News_1.2'), );
функция дърво($treeArray, $pid = 0) if (! $treeArray) return; > foreach($treeArray as $item) if ($item['parent_id'] == (int) $pid) echo($item['page'] . '') ; дърво($treeArray, $item['id']); > > >
дърво ($queryResult); Не мога да гарантирам, че това е най-доброто решение, но все пак...
Благодаря Андрей. Разбира се, трябва да опитате всичко това.
И аз използвам ajax, така че дървото ми не е скъпо, само че разходите отиват само за рисуване на отворен клон, който първоначално се отваря, за да разбере търсачката къде сме в дървото, другото се зарежда през json през ajax. Така рисуването на дървото на клиента върви :-))
rastakoy, може ли да покажеш как се изпълнява при теб?
и какво да покажа там... всичко е елементарно просто.. 1. Хвърлете, например. към записа на базата данни с полетата id, navigation_title, parent_id. 2. След това, когато щракнете върху елементанавигация, изпращаме ajax заявка през същата jquery и предаваме идентификатора на кликнатия елемент като параметър ... 3. на сървъра грабваме всички елементи от менюто от базата данни, където parent_id = нашето id, което получихме като параметър, изпращаме изкопаните данни обратно във формат json ... 4. На страницата, от която е изпратена ajax заявката, получаваме отговор и ако получим непразен json обект, изграждаме DOM дърво с помощта на javascript ...
p.s. вместо база данни, можете да вземете данни от този php масив или json файл, можете, ако внедрите система за кеширане напълно според Фън Шуй .. накратко, много неща могат да бъдат ...