Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с иерархией в массивах, Практичечкая задача по созданию дерева 
V
    Опции темы
Pitbul
  Дата 4.10.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



Добрый день. Недавно передо мной стала задача создать сайт с большим количеством пунктов / подпунктов каталога.
Буду лаконичным, как спартанец smile 

Дано:

1. Таблица в БД categories ( cat_id | parent | cat_name )
2. Запрос с помощью которого мы вытаскиваем все записи из таблицы categories:

Код

$query = 'SELECT * FROM categories ORDER BY cat_id ASC';
$res = mysql_query($query);


3. Запись каждой строки результирующей таблицы в специально созданный массив $list

Код

$list = array();

while ($row = mysql_fetch_assoc($res))
{
    $list[$row['cat_id']]['parent'] = $row['parent'];
    $list[$row['cat_id']]['cat_name'] = $row['cat_name'];
}


4. Функция, которая работает непосредственно с массивом $list, чтобы избежать постоянных запросов к БД.

Код

function tree(&$massiv)
{
    echo '<ul>';
    for ($i = 1; $i <= count($massiv); $i++)
    {
        echo '<li>'.$massiv[$i]['cat_name'].'</li>';
        //условия для сравнения cat_id со значениями parent
        //не придумал
    }
    
    echo '</ul>';
}


Вопрос:

Какие условия сравнения cat_id со значениями parent придумать, чтобы иерархический каталог был действующим? Т.к. то до чего додумался я просто выводит все в виде списка с одинаковым уровнем вложенности. 

Буду рад услышать и советы по оптимизации моего решения. 

Огромное спасибо smile 
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
ayax2005
Дата 4.10.2010, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


echo $smile
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 17.4.2008
Где: Питер

Репутация: 2
Всего: 11



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


--------------------
все вопросы - из-за неверной формулировки задачи
PM MAIL ICQ   Вверх
baldina
Дата 4.10.2010, 22:38 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

function tree(&$massiv, $cat_id)
{
    echo '<li>'.$massiv[$cat_id]['cat_name'].'</li>';

    echo '<ul>';

    foreach ($massiv as $id => $data)
    {
        if ($data['parent'] == $cat_id)
           tree ($massiv, $id);
    }
    
    echo '</ul>';
}

echo '<ul>';
tree ($list, 0);
echo '</ul>';

где-то так

Это сообщение отредактировал(а) baldina - 4.10.2010, 22:41
PM MAIL   Вверх
Pitbul
Дата 4.10.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



ayax2005

Но я думал использовать в функции алгоритм такого плана:

1. Записываем строку с cat_id = 1
2. Проводим поиск по массиву $list и выискиваем все строки где parent = 1
3. Выводим вслед за cat_id = 1 все строки где parent = 1 и сразу же анСэтим их из $list
4. Проводим ту же операцию, но для cat_id = 2
...

Неужели это плохой алгоритм? 

Это сообщение отредактировал(а) Pitbul - 4.10.2010, 22:44
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 4.10.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



я Вам выше такой алгоритм и набросал.
но он действительно плохой, т.к. использует Ваш $list, а это неэффективно.
лучше каждым элементом массива с cat_id хранить массив элементов, у которых parent==cat_id. т.е. хранить в виде дерева. тогда его обход будет проще, без лишних проверок.
щас покажу...
PM MAIL   Вверх
Pitbul
Дата 4.10.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



baldina

Хороший код получился smile 
Буду с ним и далее работать! Очень признателен! smile 

Окей, тогда жду новый вариант решения задачи. Будет интересно посмотреть на новые пути решения smile 

Это сообщение отредактировал(а) Pitbul - 4.10.2010, 22:53
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 4.10.2010, 22:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

while ($row = mysql_fetch_assoc($res))
    $list[$row['parent']]['subtree'][] = array ($row['cat_id']=>array('cat_name'=>$row['cat_name'], 'subtree'=>array()));

...

function tree(&$tree)
{
    echo '<li>'.$tree['cat_name'].'</li>';
    echo '<ul>';
    foreach ($tree['subtree'] as $id => $data)
           tree ($data);
    
    echo '</ul>';
}

echo '<ul>';
tree ($list[0]);
echo '</ul>';



Это сообщение отредактировал(а) baldina - 4.10.2010, 23:06
PM MAIL   Вверх
ayax2005
Дата 4.10.2010, 23:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


echo $smile
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 17.4.2008
Где: Питер

Репутация: 2
Всего: 11



baldina, +стопяцот


--------------------
все вопросы - из-за неверной формулировки задачи
PM MAIL ICQ   Вверх
Pitbul
  Дата 4.10.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fruzenshtein
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 30.4.2008
Где: Киев

Репутация: нет
Всего: нет



ayax2005baldina

Кодерское спасибо Вам за помощь=)  smile 
--------------------
### JAVA  ######  programming ###
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.