Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 04:36   #1
alt5000
PHP
Пользователь
 
Аватар для alt5000
 
Регистрация: 28.03.2007
Сообщений: 70
Восклицание Древовидная структура

Окончательно убедившись, что в SQL нет конструкции, способной выстроить нормальное дерево (наподобие оракловского connect by prior), пошел нп решитнльный шаг - самостоятельно соорудить нечто подобное

В итоге получилась функция, возвращающая всех детей


PHP код:
function get_child($uid)
{

    
$link mysql_connect($host$user$pswd) or die ("Can't connect to database");
    
mysql_select_db($database$link) or die ("Can't select DB");
    
$query "SELECT `text_r` FROM `wc` WHERE `prv_id`='$uid' ORDER BY `text_r`" or die ("Can't SELECT from DB");
    
$result mysql_query($query$link);
    while(
$row=mysql_fetch_array($result))
 {
 echo(
"<li>".$row['text_r']."</li>");
 }


И горе-обработчик
PHP код:
function create_tree($uid)
{

    
$link mysql_connect($host$user$pswd) or die ("Can't connect to database");
    
mysql_select_db($database$link) or die ("Can't select DB");
    
$query "SELECT `text_r`,`id`, `prv_id` FROM `wc` ORDER BY `id`" or die ("Can't SELECT from DB");
    
$result mysql_query($query$link);
    while(
$row=mysql_fetch_array($result))
 {

 echo(
"<b>".$row['text_r']."</b><br>");
 
get_child($row['id']);
 }


Формируется вот такой список

Головной офис
- Бухгалтерия
- Головной офис
- Отдел маркетинга
- Отдел сбыта
- Площадка погрузки 1
- Площадка погрузки 2
- Подразделение 2
- Площадка погрузки 1
- Площадка погрузки 2
- Склад
- Подразделение 1
- Подразделение 1.1
- Подразделение 1.1
Подразделение 2
Подразделение 3
Подразделение 1
- Подразделение 1.1
- Подразделение 1.1
Подразделение 3
Отдел сбыта
- Склад
Бухгалтерия
Отдел маркетинга

Как видите, здесь узлы повторяются, так как просто перебираются все записи по порядку и выюираются их "дети".

Никак не могу понять как мне сделать, чтобы и под детьми отображались их дети? Чтобы узлы не дублировались , а ветки строились с учетом подветок, подподветок и т.д. ?
alt5000 вне форума Ответить с цитированием
Старый 12.12.2011, 17:38   #2
spein
Программист
Форумчанин
 
Аватар для spein
 
Регистрация: 27.02.2009
Сообщений: 505
По умолчанию

Покажи структуру таблицы "wc"
there are no limits when you're software engineer
spein вне форума Ответить с цитированием
Старый 12.12.2011, 21:52   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,179
По умолчанию

вообще использование запросов в циклах и рекурсях - оченно плохо.... поймете при больших БД и деревьях. Лучше все делать только с массивами - id элементов таблиц..
ADSoft вне форума Ответить с цитированием
Старый 13.12.2011, 08:52   #4
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию

Я конечно не с "яицами", но у меня получилось что-то вроде этого:
Код:

function getTreeItems($parent){
	$query="select * from menu where parent='".intval($parent)."'";
	$result=mysql_query($query) or die('lol');
	for($mas=array();$row=mysql_fetch_array($result);$mas[]=$row){}
	return $mas;
}
function getTree($parent)
{
	$items=getTreeItems($parent);
	for($i=0;$i<count($items);$i++){
		$tree.="<li>".$items[$i]['name'];
		if(count(getTreeItems($items[$i]['id']))>0){
			$tree.='<ul>';
			$tree.=getTree($items[$i]['id']);
			$tree.='</ul>';
		}
		$tree.='</li>';
	}
	return $tree;
}
echo '<ul>';
	echo getTree(0);
echo '</ul>';
структура таблица:
Код:
`id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `parent` int(11) NOT NULL,
  PRIMARY KEY (`id`)
то, что в таблице:
Код:
(1, 'пункт 1', 0),
(2, 'подпункт 1.1', 1),
(3, 'подпункт 1.1', 1),
(4, 'подпункт 1.2', 1),
(5, 'подпункт 4.1.1', 4),
(6, 'подпункт 4.1.2', 4),
(7, 'подпункт 3.1.2', 3);
результат:

Последний раз редактировалось CodeNOT; 13.12.2011 в 08:54.
CodeNOT вне форума Ответить с цитированием
Старый 16.12.2011, 00:13   #5
chyvakoff
Пользователь
 
Аватар для chyvakoff
 
Регистрация: 10.12.2011
Сообщений: 91
По умолчанию

Вот так ещё можно построить рекурсию.
chyvakoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Древовидная структура таблицы в гриде AK BULLETS Общие вопросы Delphi 3 21.03.2010 02:51
структура hungry Общие вопросы C/C++ 11 25.06.2009 20:31
структура Cpluser Общие вопросы C/C++ 4 16.06.2009 17:42
Структура SL1CK Общие вопросы C/C++ 8 08.06.2009 21:31
структура cr1mson Общие вопросы C/C++ 3 14.01.2009 18:08