 |
 |
Форум сетевых администраторов » Программирование » PHP » Печать дерева
| Автор |
| Тема |
 |
|
 |
|
|
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
Кто-то тут возмущялся что никаких задач новых не поступает. Вот тут у меня появилась одна. С первого взгляда вроде просто, а на самомом деле уже второй день голову ломаю. Ну да ладно, от слова к делу. Итак имеем массив категорий:
PHP:
$categories =
Array
(
'1' => Array
(
'categoryid' => 1,
'parentid' => 0,
'title' => 'Top Category 1'
),
'4' => Array
(
'categoryid' => 4,
'parentid' => 0,
'title' => 'Top Category 2'
),
'2' => Array
(
'categoryid' => 2,
'parentid' => 1,
'title' => 'Child Category 1'
),
'5' => Array
(
'categoryid' => 5,
'parentid' => 2,
'title' => 'Child Category 2'
),
'6' => Array
(
'categoryid' => 6,
'parentid' => 5,
'title' => 'Child Category 3'
),
'3' => Array
(
'categoryid' => 3,
'parentid' => 1,
'title' => 'Child Category 4'
)
);
Далее имеем массив родительских категорий, это нужно для работы с массивом категорий, он позволяет осуществлять любые операции с данным массивом, в частности для расспечатывания дерева, получения всех подчиненных категорий и т.д.
PHP:
$parent_categories =
Array
(
'0' => Array
(
'0' => 1,
'1' => 4
),
'1' => Array
(
'0' => 2,
'1' => 3
),
'2' => Array
(
'0' => 5
),
'5' => Array
(
'0' => 6
)
);
Ну и далее имеем функцию, которая расспечатывает дерево:
PHP:
function print_tree ($cid = 0, $depth = 1)
{
global $categories, $parent_categories;
if (!isset($parent_categories[$cid]))
{
return;
}
foreach ($parent_categories[$cid] AS $key => $cat_id)
{
if ($depth > 1) {
$title = str_repeat(" ", $depth - 1) . " " . $categories[$cat_id]['title'] . " #$cat_id\n";
} else {
$title = $categories[$cat_id]['title'] . " #$cat_id\n";
}
echo $title;
print_tree($cat_id, $depth + 1);
}
}
// вызываем функцию
echo '<pre>';
print_tree();
В результате получим:
code:
В общем то что и требаволось, получили древовидную структуру категорий.
Теперь сама задача: нужно сделать раскрывающиеся списки, как в проводнике виндовза, для этого нужно заключить группы категорий в <div> теги. В общем смотрите результат который требуется получить:
code:
С открытием кода не возникает проблем, это совсем просто:
PHP:
if (isset($parent_categories[$cat_id]))
{
echo str_repeat(" ", $depth - 1) . "<div id=\"catgroup_$cat_id\">\n";
}
Но вот как быть с закрытием, ка сделать чтобы тег закрывался в нужном месте?
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
17-07-2004 12:04 |
|
|
Администратор
|
| Все! Ð_ешение найдено. Все оказалось достаточно... |
[сооб. #68960]
17-07-2004 17:22 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
Все! Ð_ешение найдено. Все оказалось достаточно просто, хотя может и не так изящно. Пока публиковать не буду, хочется посмотреть на другие варианты. Кстати, если вы считаете спецом в пхп, не поленитесь решить эту простую задачку и тем самым подтвердить свое мастерство.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
17-07-2004 17:22 |
|
|
Power in your mind !
|
[QUOTE]Первоначальное сообщение от polo
[b]rio... |
[сооб. #68973]
18-07-2004 01:48 |
|
Power in your mind !


Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус:  |
quote: Первоначальное сообщение от polo
rio зачем мне это? Была поставлена задача, вот и нужно конкретное решение. А в твоем случае, тысячу запросов к базе, вообще никуда негодный.
ну то что из старого было то и выкинул времени не было ... щас решим нормально твою задачку
rio добавил 18-07-2004 в 02:07:36:
PHP:
function print_tree ($cid = 0, $depth = 1)
{
global $categories, $parent_categories;
if (!isset($parent_categories[$cid]))
{
return;
}
foreach ($parent_categories[$cid] AS $key => $cat_id)
{
if ($depth > 1) {
$title = str_repeat(" ", $depth - 1) . " " . $categories[$cat_id]['title'] . " #$cat_id\n ";
} else {
$title = $categories[$cat_id]['title'] . " #$cat_id\n";
}
echo $title;
if (isset($parent_categories[$cat_id]))
{
echo str_repeat(" ", $depth - 1) . "<div id=\"catgroup_$cat_id\">\n";
}
print_tree($cat_id, $depth + 1);
if (isset($parent_categories[$cat_id]))
{
echo str_repeat(" ", $depth - 1) . "</div>\n";
}
}
}
Вот твое решение!
__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете ! 
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 01:48 |
|
|
Power in your mind !
|
Хех , уж кто бы сомневался ^_^
[size=1][i]rio добавил... |
[сооб. #68978]
18-07-2004 02:58 |
|
Power in your mind !


Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус:  |
Хех , уж кто бы сомневался ^_^
rio добавил 18-07-2004 в 03:00:32:
я кстати и на машинке вышивать умею(с) - Маироскин, м-ф "Простоквашино"
__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете ! 
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 02:58 |
|
|
Участник+
|
| polo прошу прощения за может быть неуместное... |
[сооб. #68985]
18-07-2004 08:31 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
polo прошу прощения за может быть неуместное предложение, но как то мне это немного странным кажется... 2 массива...
Я в универ делал лабу "Ð_кспертная система фреймового типа" на основе phpDbTree (незнаю как его правильно назвать), мне показалось это решение очень изящным и простым... (см. phpclub.ru "Хранение древовидных структур в БД") Может быть оно подойдёт?..
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 08:31 |
|
|
Администратор
|
| нет времени с этим разбираться, я этот способ... |
[сооб. #68993]
18-07-2004 11:22 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
нет времени с этим разбираться, я этот способ использую уже достаточно давно. Вот рио спрашивал какую статью написать, вот ему и тема для обсуждение, рассмотрение этих двух способов, выявить все + и -.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 11:22 |
|
|
Участник+
|
| Ну ИМХО они довольно очевидны... причём как... |
[сооб. #68994]
18-07-2004 12:00 |
|
Участник+


Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: ![he][es в оф-лайне](images/offline.gif) |
Ну ИМХО они довольно очевидны... причём как я посмотрю у БД намного больше + (или это поверхностный взгляд?), а тут -...
А разбираться там почти ненадо, я за день сделал Ð_С... Всё очень просто, посмотри...
__________________
Админ - вождь Апачей...
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 12:00 |
|
|


Power in your mind !
|
| тема! буду работать над этим |
[сооб. #68999]
18-07-2004 18:31 |
|
Power in your mind !


Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус:  |
тема! буду работать над этим
__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете ! 
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 18:31 |
|
|
Администратор
|
| he][es кто к чему привык, я например не очень... |
[сооб. #69001]
18-07-2004 19:29 |
|
Администратор


Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус:  |
he][es кто к чему привык, я например не очень люблю использовать ООП в пхп, а все переписывать нафиг нужно, если есть свое решение, уже отработанное и уверен что ничем не уступает тобой предложенному.
__________________
Всегда есть решение.
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
18-07-2004 19:29 |
|
|
Power in your mind !
|
| PhP всетаки не Обьектно ореинтированный язык... |
[сооб. #69025]
19-07-2004 07:54 |
|
Power in your mind !


Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус:  |
PhP всетаки не Обьектно ореинтированный язык , не стоит забывать об этом
__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете ! 
Сообщить модератору об этом сообщении | Предупреждение | IP: определен
|
19-07-2004 07:54 |
|
|
|
Формат времени GMT. Текущее время 12:11.
|
Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения. |
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
|
|
|
|
| |
Page generated in 1.16097903 seconds (99.54% PHP - 0.46% MySQL) with 26 queries.
|
 |