3-х уровневое меню, супер вложенный массив

Julliet

Новичок
Всем привет, обрисую задачу поэтапно.
есть в базе данных таблица "pages" в которой хранятся значения о страницах сайта.
у таблицы поля такие "id" - уникальный идентиф., "title" - заголовок страницы, тайтл; "level" - уровень в иерархии, "parent_id" - id родительской страницы, "url" - url.
Нужно вывести тайтлы и url страниц, начиная с первого уровня и заканчивая третьим.
Т.е, нужно показать иерархию, допустим такую:

ОГОРОД
Овощи
| Капуста
| | Белокочанная
| | Цветная
| | Кольраби
| Картофель
| | | большой
| | | мелкий
| | | средний
Ягоды
| Смородина
| | Чёрная
| | Красная

Да, а еще страницы фрукты-овощи - они в свою очередь имеют родительский док - "Огород"

Итак, мы знаем что есть страница "Огород", и знаем ее ID. Пускай он равняется "3". Уровень у Огорода = 0.
Поехали.

1-м sql-запросом выберем подчиненные страницы для "Огорода" - выбираем ID, title с условием where parent_id=3 и level=1.

Проверяем, что результат запроса не пустой, и запускаем первый цикл, в котором получаем IDшники подчиненных "Огороду" страниц
PHP:
            while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
                                
			$parent=$row['pages_id'];
			                }
Так. с $parent , которая содержит IDшки страниц 1-го уровня, нужно запускать еще один запрос в базу,
отбираем страницы, у которых level=2 и parent_id=$parent.

т.е., код начинает выглядеть так:
PHP:
while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
			
			                $parent=$row['pages_id'];
							
							$med = $dbc->query("SELECT pages_title, pages_id, pages_visible FROM ".db_name."_".db_lang."_pages WHERE pages_level=2 AND pages_parent_id=".$parent." ORDER BY pages_number");
							
							$med_title=array();
							$med_id=array();
                            while ($row2 = $med->fetchRow(DB_FETCHMODE_ASSOC))
							{
                         
							 
							if ($row2['pages_visible']==0){
							$med_title[$row2['pages_id']]=$row2['pages_title'];
							}///тут еще проверяю видимость (которую определил пользователь, но это мелочи)
							else $med_title[$row2['pages_id']]='';
			               } //////конец выборки для 2-го уровня
Тут у нас уже получается массив с данными (для второго уровня, вообще не знаю почему, но, если массив не использовать, то выведет только 1 значение для селекта 2-го уровня).

Т.е., набор IDшек страниц второго уровня - это массив.

Получается, что следующий шаг - это впихнуть в код foreach ($med_id as $index => $mid) для этого массива, и на каждом шаге обхода делать sql запрос с условием where parent_id=$mid. Т.е., вот так:

PHP:
while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
			
			                $parent=$row['pages_id'];
							
							$med = $dbc->query("SELECT pages_title, pages_id, pages_visible FROM ".db_name."_".db_lang."_pages WHERE pages_level=2 AND pages_parent_id=".$parent." ORDER BY pages_number");
							
							$med_title=array();
							$med_id=array();
                            while ($row2 = $med->fetchRow(DB_FETCHMODE_ASSOC))
							{
                            $med_id[] = $row2['pages_id'];
                             foreach($med_id as $index => $mid)
                            {
							//// вот в этом месте должен быть 3-й запрос в базу,  с where parent_id=$mid
  //////  а потом еще формироваться последний массивчик с названием end, и данными о страницах 3 уровня
						    }
							 
							if ($row2['pages_visible']==0){
							$med_title[$row2['pages_id']]=$row2['pages_title'];
							}
							else $med_title[$row2['pages_id']]='';
			               } //////конец выборки для 2-го уровня
И вот тут у меня ступор! я два дня ковыряюсь с этим, вроде всё понятно, но как записывать элементы, выбранные из базы на 3-м шаге? в какой массив? как он должен выглядеть вообще - я уже устала и ничего не соображаю...

Затупила на этом и всё.

Вопрос несложный, а вот сделать не получается. Всё какой-то бред... Перечитала кучу статей по массивам, толи я искать не умею, но попадалось совсем не то...
 

Mamont

Новичок
Лучше почитать на тему "Хранение древовидных структур в базах данных"
 

Julliet

Новичок
Лучше почитать на тему "Хранение древовидных структур в базах данных"
мне некогда менять структуру бд и переписывать эту цмску. Мне надо сделать сегодня это дерево, господи, ну там же по любому просто всё...
 

cDLEON

Онанист РНРСlub
Ты, судя по тому, что дописано, лучше бы не написал. Не нужно было браться за то, чем не владеешь.
 

KorP

Новичок
PHP:
$result = mysql_query("SELECT `id`, `parent_id`, `title`, `url` FROM `garden` ORDER BY `parent_id`");
$menu = array();
$menu_index = array();
while($row = mysql_fetch_assoc($result)){
	if($row['parent_id'] == 0) {
		$menu[] = $row;
		$menu[sizeof($menu)-1]['child'] = array();
		$menu_index[$row['id']] = &$menu[sizeof($menu)-1];
	} else {
		$menu_index[$row['parent_id']]['child'][] = $row;
		$menu_index[$row['id']] = &$menu_index[$row['parent_id']]['child'][sizeof($menu_index[$row['parent_id']]['child'])-1];
	}
}
и тормознуть в нужный момент, ну потом массив уже трясём как нужно. или я не понял чего?
 

Julliet

Новичок
KorP, мне нравится ваше решение.
мне уже один товарищ предлагал подобное, правда, там не так изысканно...

да!! тогда днём я уже психовала с этим деревом, и была готова select * писать, получать бааааальшущий массив и ...
ну все-таки успокоилась и сделала запрос, такой, как вы предлагаете. Но вот дальше - чтобы сформировать такую красоту из полученных данных - мозгов, увы не хватило.

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

из всего, что мне кто-либо предлагал, ваш вариант почему-то выглядит самым изящным.
 
Сверху