Из Nested Sets в Adjacency List

off

Новичок
Из Nested Sets в Adjacency List

Помогите плиз. Нужна функция для вывода данных из таблицы (Nested Sets) в формате Adjacency List. Т.е в таком виде

Структура таблицы:
id - id элемента
left_key
right_key
parent_id - id родителя
text - собственно текст
level - уровень вложенности

txt1
txt1_1
txt1_2
txt1_3
txt_1_3_1
txt_1_3_2
txt_1_3_3
txt1_4
txt_1_4_1
txt_1_4_2
txt1_5
txt1_6

txt2

txt3

Мучаюсь уже долго, не могу сообразить.

-~{}~ 13.01.06 01:33:

Заранее спасибо :)
 

off

Новичок
2 дня :) Ты кстати писал такое. Тока наоборот да?

Я пропую рекруссивную функцию сделать, но не получается ;)
 

alpine

Новичок
off
Ничего не понял ...
Что у тебя есть и что должно быть еще раз и внятно.
 

off

Новичок
ок. Есть таблица в БД составленная по алгоритму nested sets.
ЕЕ структура такая:

id - id элемента
left_key
right_key
parent_id - id родителя
text - собственно текст
level - уровень вложенности

Мне нужно вывести данные из этой таблицы таким образом:

Раздел1
-подраздел1_1
-подраздел1_2
-подраздел1_3
----подподраздел_1_3_1
----подподраздел_1_3_2
----подподраздел_1_3_3
-подраздел1_4
----подподраздел_1_4_1
----подподраздел_1_4_2
-подраздел1_5
-подраздел1_6

Раздел2

Раздел3


Более понятно объяснить не смогу (наверное) ;)
 

alpine

Новичок
off
Могу тебе сказать одно, - что конвертировать тебе ничего никуда не надо, у тебя уже все есть и вывод тебе нужно форматировать в скрипте или шаблоне.
PS Сейчас лучше поспать и завтра с новыми силами ...
 

off

Новичок
где 1_1 - это индексы.

Например 2_3_3 - это значит, что подраздел с таким индексом является 3-им по счету из всех подразделов раздела номер 3, который в свою очередь является 2-ым по счету из всех разделов.

-~{}~ 13.01.06 02:24:

alpine

Понятно. Короче нужно вывести дерево Nested sets вот в таком виде.

-~{}~ 13.01.06 02:25:

Буду ждать ;)
alpine
 

SelenIT

IT-лунатик :)
off

hint: каков смысл параметров left_key и level в твоей модели?
 

off

Новичок
level - Это уровень вложенности раздела

по поводу left key читай тут
http://www.webscript.ru/stories.php3?story=04/09/01/8197045
 

SelenIT

IT-лунатик :)
Читаю:
Фактически это путь обхода всех узлов дерева слева направо
А уровень вложенности показывает, сколько черточек перед ним рисовать (образно).
Неужели все равно чего-то не хватает?
 

Popoff

popoff.donetsk.ua
off
да, я еще не все возможные алгоритмы реализовал :)
если ты 2 дня искал реализацию, то ты зря тратил время. гораздо полезнее было бы потратить эти два дня на то, чтобы разобраться с методом и написать собственную процедуру :)
 

off

Новичок
Так мне нужно не кол-во черточек, а идекс рядом с названием раздела. Например:

подподраздел [1_4_2] -> вот этот индекс :)
 

alpine

Новичок
Popoff
А что конкретно эта процедура должна делать для его таблицы? :D
 

off

Новичок
Popoff я пытался написать, я же говорю. Искать начал только сейчас.
 

SelenIT

IT-лунатик :)
off

Во-первых, у тебя есть parent_id (который в Nested sets вообще-то лишний).

Во-вторых, число цифр в "индексе" равно уровню вложенности. У каждого следующего элемента меняется лишь последняя цифра, притом очевидным образом...
 

off

Новичок
Вот что я смог написать, но это работает некорректно(т.е не выдает желаемого результата). Может кто нибудь поможет? Нужен код
PHP:
<?
function form_menu ($level,$postfix,$i){

	global $P;

	$sql = "SELECT * FROM ".$P."_tree WHERE level=$level order by left_key";
	$res = mysql_query($sql);
	if (mysql_num_rows($res)==0) return ;

	while($row = mysql_fetch_array($res)){
		
		
		if ($level==1) $postfix = $i;
		if ($level>1) 
		{
			$postfix = $postfix.'_'.$i;
		}
		
		$page_id = $row['page_id'];
		$l_k = $row['left_key'];
		$r_k = $row['right_key'];

//Берем название, ссылку этой страницы из таблицы pages по выбранному page_id
		
$sql_page = "SELECT * FROM ".$P."_pages WHERE page_id=$row[page_id] and page_status='enabled' and page_public='yes'";
		$res_page = mysql_query($sql_page);
		
		$row_page = mysql_fetch_array($res_page);
	
		$link = $row_page['link'];
		$title = $row_page['title'];

		//Ищем детей
		$sql_node = "SELECT * FROM ".$P."_tree WHERE left_key > $l_k and right_key < $r_k and level=$level+1 order by left_key";
		$res_node = mysql_query($sql_node);
	
		if (mysql_num_rows($res_node) > 0) //Если дети есть
		{	
			
			echo $title.'&nbsp'.$postfix."<br>";
			form_menu($level+1,$postfix,$i=1);
		}
		
		else {
			
			echo $title.'&nbsp'.$postfix."_$i<br>";
			
			$i++;
			
}
	}
	}


//Вызываем функцию
form_menu(1,'',1);
?>
 

alpine

Новичок
[off]
Мне кажется это нужно перенести во все о программировании. Там скорее эту задачу помогут решить.
[/off]
 
Сверху