Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
netadmin.ws
Панель управления Регистрция свободна! Календарь Список пользователей Часто задаваемые вопросы Поиск по форуму Архив скриптов Главная   
Форум сетевых администраторов
Форум сетевых администраторов Форум сетевых администраторов » Программирование » PHP » Печать дерева
Предыдущая тема     Следующая тема
Автор
Тема    Новая тема     Ответить на эту тему
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
Печать дерева [сообщение #68948]

Кто-то тут возмущялся что никаких задач новых не поступает. Вот тут у меня появилась одна. С первого взгляда вроде просто, а на самомом деле уже второй день голову ломаю. Ну да ладно, от слова к делу. Итак имеем массив категорий:

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:
Top Category 1 #1
     Child Category 1 #2
         Child Category 2 #5
             Child Category 3 #6
     Child Category 4 #3
Top Category 2 #4


В общем то что и требаволось, получили древовидную структуру категорий.
Теперь сама задача: нужно сделать раскрывающиеся списки, как в проводнике виндовза, для этого нужно заключить группы категорий в <div> теги. В общем смотрите результат который требуется получить:

code:
Top Category 1 #1
<div id="catgroup_1">
     Child Category 1 #2
    <div id="catgroup_2">
         Child Category 2 #5
        <div id="catgroup_5">
             Child Category 3 #6
        </div>
    </div>
     Child Category 4 #3
</div>
Top Category 2 #4


С открытием кода не возникает проблем, это совсем просто:

PHP:

if (isset($parent_categories[$cat_id]))
        {
            echo 
str_repeat("    ", $depth - 1) . "<div id=\"catgroup_$cat_id\">\n";
        }


Но вот как быть с закрытием, ка сделать чтобы тег закрывался в нужном месте?

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-07-2004 12:04
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #68960]

Все! Ð_ешение найдено. Все оказалось достаточно просто, хотя может и не так изящно. Пока публиковать не буду, хочется посмотреть на другие варианты. Кстати, если вы считаете спецом в пхп, не поленитесь решить эту простую задачку и тем самым подтвердить свое мастерство.

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 17-07-2004 17:22
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
rio
Power in your mind !
Средний рейтинг: 3.67 | Оценок: 3
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус: rio в оф-лайне
[сообщение #68973]

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: определен

Old Post 18-07-2004 01:48
Нажмите сюда для просмотра профайла rio Отправить Персональное сообщение rio Посетить домашнию страничку rio! Найти сообщения от rio Добавить rio в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #68977]

rio молодец, 5-ка тебе .

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 02:55
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
rio
Power in your mind !
Средний рейтинг: 3.67 | Оценок: 3
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус: rio в оф-лайне
[сообщение #68978]

Хех , уж кто бы сомневался ^_^

rio добавил 18-07-2004 в 03:00:32:
я кстати и на машинке вышивать умею(с) - Маироскин, м-ф "Простоквашино"

__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете !

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 02:58
Нажмите сюда для просмотра профайла rio Отправить Персональное сообщение rio Посетить домашнию страничку rio! Найти сообщения от rio Добавить rio в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #68985]

polo прошу прощения за может быть неуместное предложение, но как то мне это немного странным кажется... 2 массива...
Я в универ делал лабу "Ð_кспертная система фреймового типа" на основе phpDbTree (незнаю как его правильно назвать), мне показалось это решение очень изящным и простым... (см. phpclub.ru "Хранение древовидных структур в БД") Может быть оно подойдёт?..

__________________
Админ - вождь Апачей...

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 08:31
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #68993]

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

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 11:22
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
he][es
Участник+
Средний рейтинг: 4.07 | Оценок: 30
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Mar 2003
Место проживания: Барнаул, Россия
Публикаций: 1169
Статус: he][es в оф-лайне
[сообщение #68994]

Ну ИМХО они довольно очевидны... причём как я посмотрю у БД намного больше + (или это поверхностный взгляд?), а тут -...
А разбираться там почти ненадо, я за день сделал Ð_С... Всё очень просто, посмотри...

__________________
Админ - вождь Апачей...

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 12:00
Нажмите сюда для просмотра профайла he][es Отправить Персональное сообщение he][es Найти сообщения от he][es Добавить he][es в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
rio
Power in your mind !
Средний рейтинг: 3.67 | Оценок: 3
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус: rio в оф-лайне
[сообщение #68999]

тема! буду работать над этим

__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете !

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 18:31
Нажмите сюда для просмотра профайла rio Отправить Персональное сообщение rio Посетить домашнию страничку rio! Найти сообщения от rio Добавить rio в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #69001]

he][es кто к чему привык, я например не очень люблю использовать ООП в пхп, а все переписывать нафиг нужно, если есть свое решение, уже отработанное и уверен что ничем не уступает тобой предложенному.

__________________
Всегда есть решение.

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 18-07-2004 19:29
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
rio
Power in your mind !
Средний рейтинг: 3.67 | Оценок: 3
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Sep 2002
Место проживания: Moscow
Публикаций: 172
Статус: rio в оф-лайне
[сообщение #69025]

PhP всетаки не Обьектно ореинтированный язык , не стоит забывать об этом

__________________
Ковчег построили дилетанты, а профессионаллы построили "Титаник" - не бойтесь спрашивать то , чего вы не знаете , а так же делать то - чего не умеете !

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 19-07-2004 07:54
Нажмите сюда для просмотра профайла rio Отправить Персональное сообщение rio Посетить домашнию страничку rio! Найти сообщения от rio Добавить rio в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя



Формат времени GMT. Текущее время 12:11.
Новая тема   Ответить на эту тему [ Версия для печати Печать | Отправить эту страницу другу/знакомому! Отправить | Получать уведомления об обновлении этой темы Подписка ] Предыдущая тема     Следующая тема
Навигация по форуму:
Оценка темы:

Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения.
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
 

Page generated in 1.16901207 seconds (99.53% PHP - 0.47% MySQL) with 26 queries.


  Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
©NetAdmin.ws, 2001-2026.
Powered by: vBulletin
Copyright ©2000, 2001, Jelsoft Enterprises Limited.