PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lamozavrik
Отправлено: 04 Марта, 2012 - 13:38:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Всем привет. Хотел поделится, может кому то пригодится =) Вообщем, встала передо мной задача сделать дерево категорий на сайте бесконечной вложенности. Конечно же сразу начал смотреть в сторону рекурсии. Короче, на скорую руку придумал таблицу категорий в БД следующей структуры:

id | parent_id | title

где id - идентификатор категории(AUTO_INCREMENT), parent_id - идентификатор родительской категории (если категория в корне сайта, то в этом поле пишем 0), ну и title название категории.

после этого быстро родилась функция (проверок никаких не делал, т.к проверял работоспособность) =)

PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_connect('localhost', 'root', '');
  3.  
  4. $out;
  5. function foo($par_id){
  6.     global $out;
  7.     $res = mysql_query("SELECT * FROM category WHERE parent_id = $par_id");
  8.    
  9.     $out .= '<ul>';
  10.     while($rows = mysql_fetch_assoc($res)){
  11.        
  12.         $out .= '<li><a href="?id='.$rows['id'].'">'.$rows['title'].'</a></li>';
  13.         foo($rows['id']);
  14.     }
  15.     $out .= '</ul>';
  16.     return $out;
  17. }
  18. echo foo(0);
  19.  


И о чудо, работает. Мне тут же вывелось дерево категорий вот в таком виде:


Но пораскинув оставшимися мозгами я понял,что тут то "собака и зарыта" =)
А дело вот в чем! Что бы вывести мне дерево из 12-ти категорий, мне понадобилось 13 запросов к базе данных на выборку. А что если категорий будет 1000 или 10000?

Тогда я начал думать другое решение, и придумал. Оно состоит из двух функций, их удобно в класс запихнуть, но тут я покажу его именно функциями =))

И так, функция № 1:

PHP:
скопировать код в буфер обмена
  1.  
  2. function getCats($res){
  3.    
  4.     $levels = array();
  5.     $tree = array();
  6.     $cur = array();
  7.    
  8.     while($rows = mysql_fetch_assoc($res)){
  9.        
  10.         $cur = &$levels[$rows['id']];
  11.         $cur['parent_id'] = $rows['parent_id'];
  12.         $cur['title'] = $rows['title'];
  13.        
  14.         if($rows['parent_id'] == 0){
  15.             $tree[$rows['id']] = &$cur;
  16.         }
  17.         else{
  18.             $levels[$rows['parent_id']]['children'][$rows['id']] = &$cur;
  19.         }
  20.        
  21.     }
  22.     return $tree;
  23.    
  24. }
  25.  


Эта функция принимает единственным аргументом результат выборки из базы и возвращает многомерный массив с категориями

Функция №2:
PHP:
скопировать код в буфер обмена
  1.  
  2. function getTree($arr){
  3.    
  4.     $out = '';
  5.    
  6.     $out .= '<ul>';
  7.     foreach($arr as $k=>$v){
  8.        
  9.         $out .= '<li><a href="?id='.$k.'">'.$v['title'].'</a></li>';
  10.         if(!empty($v['children'])){
  11.             $out .= getTree($v['children']);
  12.         }
  13.        
  14.     }
  15.     $out .= '</ul>';
  16.     return $out;
  17.    
  18. }
  19.  


Эта функция принимает аргументом массив с категориями, который у нас появился в результате работы функции №1 и возвращает нам уже построенное дерево категорий =))

Пример работы:

PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_connect('localhost', 'root', '');
  3.  
  4. $res = mysql_query("SELECT * FROM cat ORDER BY id"); //Один единственный запрос на выборку =)
  5.  
  6. $cats = getCats($res); //из результата выборки получаем массив с категориями
  7. echo getTree($cats); //из массива с категориями получаем готовое дерево категорий =)
  8.  

И опять результат =)


На этом собственно и все! Кому нужно, забирайте =)))


-----
Ударим крепким сном по мукам совести!
 
 Top
Okula
Отправлено: 04 Марта, 2012 - 15:03:29
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




А можно было это организовать через Ajax тахнологию, подгрудать к дереву данные тогда, когда это требуется, например при на жатии на определённый раздел.
Пример такого скрипта можно с лёгкостью найти в интернете.
На данном примере основано построение дерева дирректорий в файловом менеджере cPanel
 
 Top
lamozavrik
Отправлено: 04 Марта, 2012 - 15:46:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Конечно можно через AJAX, но нужно было без него )


-----
Ударим крепким сном по мукам совести!
 
 Top
Asew
Отправлено: 11 Июля, 2019 - 12:24:14
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июль 2019  


Помог: 0 раз(а)




Спасибо за предоставленный код насчет построения дерева. Не могли бы объяснить как сделать для первого уровня дерева другой шрифт ?
 
 Top
lamozavrik
Отправлено: 12 Июля, 2019 - 12:19:33
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




Asew пишет:
Спасибо за предоставленный код насчет построения дерева. Не могли бы объяснить как сделать для первого уровня дерева другой шрифт ?

Можно попробовать всё это меню поместить в блок, например, <nav id="menu">...</nav>, и тогда сделать выборку CSS типа: #menu ul:first-child li a {color: #цвет}


-----
Ударим крепким сном по мукам совести!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB