PHP. Создание дерева категорий

Есть таблица списка категорий в базе данных. Выводим его на страницу в структурированном выхлопе. 

Для этого, одним запросом заберем все данные и заполним их в глобальный массив. А потом рекурсивным методом создадим из массива список категорий и выведем на страницу.

Таким образом мы лишимся множественных запросов к базе данных делая вывод менее нагрузочным для сервера.

Вот сруктура таблицы базы данных db_name

id parentid title_name  Вот так дожна выглядеть эта база на странице
1 0 Книги

Книги
   Фантастика
      Айзек Азимов
      Станислав Лем
      Рей Бредбери
   Детективы
      Росс Макдональдс
      Агата Кристи
      Дик Френсис
Фильмы
   Боевики
      Крепкий орешек
      Возмещение ущерба
      Двойной удар
   Комедии
      Мистер Бин
      Веселые Ребята
      Убойные каникулы

2 1 Фантастика
3 2 Айзек Азимов
4 2 Станислав Лем
5 1 Детективы
6 5 Росс Макдоналд
7 5 Агата Кристи
8 0 Фильмы
9 8 Боевики
10 8 Комедии
11 9 Крепкий орешек
12 9 Возмещение ущерба
13 10 Мистер Бин
14 10 Веселые ребята
15 2 Рей Бредбери
16 9 Двойной удар
17 10 Убойные каникулы
18 5 Дик Френсис

Вот так выглядит скрипт

< ?php

/* Объявление массива ГЛОБАЛЬНЫМ позволит увидеть его в функции getCategory() */

             global $mass_category;

       $mass_category = Array();

        mysql_connect('localhost','root','');

        mysql_select_db('db_name') or die('no connected');

/* Выбираем таблицу из базы данных */

$query = "SELECT `id`,`parentid`,`title_name` FROM `menucategory`";

$res = mysql_query($query);

/* Заполняем ранее объявленный ГЛОБАЛЬНЫЙ массив значениями из базы данных*/

while($row = mysql_fetch_array($res))

{

        $mass_category[$row['parentid']][$row['id']] =

        Array( 'title_name' => $row['title_name'],

               'id' => $row['id']

           );

/* Индексы массива распределены так: $row['parentid'], поле - родительская категория $row['id'] - уникальный идентификатор поля `id` Получится трехмерный массив имеющий такую структуру:

Array ( [0] =>

Array ( [1] => Array ( [title_name] => Книги [id] => 1 ) ) ) [0] - $row['parentid'] [1] - $row['id'] ; */

}

/* Это функция рекурсивно вызывающая сама себя, при выборке ГЛОБАЛЬНОГО массива с данными из БД. */

function getCategory($parent_id=0)

{

   global $mass_category; // наш ГЛОБАЛЬНЫЙ массив с уже заполнеными данными

/* $categorys - строковая переменная для хранения результата выборки $lev - массив с числовыми значениями для хранения уровней вложения подкатегорий. Мы их объявили статичными, что бы данные из них не терялись при перезагрузке(выходе) функции во время рекурсии. */

     static $categorys,$lev;

$_lev=0; // Переменная, для назначения уровня вложенности категорий.

// Инициализируем статичные переменные

if(empty($categorys)) $categorys='';

if(empty($lev)) $lev=Array();

/* Перебор массива начинаем с нулевого (см. аргумент ф-ции) индекса, что означает корневые строки (Книги, Фильмы) */

foreach($mass_category[$parent_id] as $v)

{

   $id=$v['id'];

    // Для класса CSS

      if(isset($lev[$parent_id]))

      {

        $_lev=$lev[$parent_id]+1;  

          $lev[$id]=$_lev;

      }else $lev[$id]=0;

       // закончили для класса CSS

       // Начали заполнять контейнер элементами    

$categorys.=
'< li class="Level'.$_lev.'">'.$v['title_name'].'< /li> '; 

 

// Если у id строки существует дочерняя категория (подкатегория), значит существует и запись в ГЛОБ массиве с этим индексом, следовательно вызываем функцию снова.

if(isset($mass_category[$id])) getCategory($id);

}
  return $categorys;
}
// вызываем нашу функцию
   $items = getCategory();
? >

< html>
  < head>
< style type="text/css">
ul{list-style-type:none;}
.Level0{font:bold 12pt arial;}
.Level1{font-weight:bold; padding-left:10px;}
.Level2{padding-left:20px;}
.Level3{padding-left:30px;}
< /style>
< /head>

< body>

< ul> < ?=$items;?>< /ul>
< /body>
< /html>

 Что это было?!

Обновленно 2017-04-14
none
Закрыть
Логин
Пароль. Только буквы или цифры.
Пароль повторить
Эл. почта. Нигде не отображается, нужна только для напоминания пароля
&nbs;