Слава Україні!

Древовидное меню

Построение древовидного меню неограниченной вложенности.
10-го жовтня 2012, 7:10
Достоинство этого скрипта в том, что он не нагружает базу данных. Запрос к базе данных делается только один раз, а вся остальная работа ведется с полученным массивом. Дамп базы данных, с которой будем работать:

    --
    -- База данных: `menu-base`
    --
    CREATE DATABASE `menu-base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
    USE `menu-base`;

    -- --------------------------------------------------------
    --
    -- Структура таблицы category
    --
    CREATE TABLE IF NOT EXISTS `category` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(255) DEFAULT NULL,
        `parent_id` int(11) NOT NULL DEFAULT ''0'',
        PRIMARY KEY (`id`),
        KEY `parent_id` (`parent_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=18 ;

    --
    -- Дамп данных таблицы `category`
    --

INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES
(1, 'FreeBSD', 0),
(2, 'Debian', 0),
(3, 'WEB', 0),
(4, 'Media', 2),
(5, 'Система', 1),
(6, 'Почта', 1),
(7, 'Инсталляция Flash Player', 4),
(8, 'Мониторинг системы FreeBSD', 5),
(9, 'Мониторинг сети - tcpdump', 5),
(10, 'PHP', 3),
(11, 'JavaScript', 3),
(12, 'CSS', 3),
(13, 'Exim часть 1', 6),
(14, 'Exim часть 2', 6),
(15, 'Exim часть 3', 6),
(16, 'HTML', 3),
(17, 'Постраничная навигация', 10);
##PHP 5 Класс для php версии 5 и выше:

<?php

class TreeMenu {

    private $_db = null;
    private $_category_arr = array();
    public function __construct() {
        //Подключаемся к базе данных, и записываем подключение в переменную _db
        $this->_db = new PDO("mysql:dbname=menu-base;host=localhost", "root", ""); 
        //В переменную $_category_arr записываем все категории (см. ниже)
        $this->_category_arr = $this->_getCategory();
    }

    /**
    * Метод читает из таблицы category все сточки, и
    * возвращает двумерный массив, в котором первый ключ - id - родителя
    * категории (parent_id)
    * @return Array
    */
    private function _getCategory() {
        $query = $this->_db->prepare("SELECT * FROM `category`"); //Готовим запрос
        $query->execute(); //Выполняем запрос
        //Читаем все строчки и записываем в переменную $result
        $result = $query->fetchAll(PDO::FETCH_OBJ);
        //Перелопачиваем массив (делаем из одномерного массива - двумерный,
        // в котором первый ключ - parent_id)
        $return = array();
        foreach ($result as $value) { //Обходим массив
            $return[$value->parent_id][] = $value;
        }
        return $return;
    }

    /**
    * Вывод дерева
    * @param Integer $parent_id - id-родителя
    * @param Integer $level - уровень вложености
    */
    public function showTree($parent_id, $level) {
        //Если категория с таким parent_id существует
        if (isset($this->_category_arr[$parent_id])) {
            foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее
                /**
                * Выводим категорию
                *  $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
                */
                echo "<div style=\"margin-left:".($level * 25)."px;\">".$value->name."</div>";
                $level  ; //Увеличиваем уровень вложенности
                //Рекурсивно вызываем этот же метод, но с новым $parent_id и $level
                $this->showTree($value->id, $level);
                $level--; //Уменьшаем уровень вложености
            }
        }
    }
}

$tree = new TreeMenu();\r\n$tree->showTree(0, 0); //Выводим дерево
##PHP 4 Функции для php версии 4:

    <?php
    mysql_connect("localhost", "root"); //Подключаемся к базе данных
    mysql_select_db("menu-base"); //Выбираем базу данных

    /**
    * Метод читает из таблицы category все сточки, и
    * возвращает двумерный массив, в котором первый ключ - id родителя
    * категории (parent_id)
    * @return Array
    */
    function getCategory() {
        $query = mysql_query("SELECT * FROM `category`");
        $result = array();
        while ($row = mysql_fetch_array($query)) {
            $result[$row["parent_id"]][] = $row;
        }
        return $result;
    }

    //В переменную $category_arr записываем все категории
    $category_arr = getCategory();

    /**
    * Вывод дерева
    * @param Integer $parent_id - id-родителя
    * @param Integer $level - уровень вложености
    */
    function outTree($parent_id, $level) {
        global $category_arr; //Делаем переменную $category_arr видимой в функции
        //Если категория с таким parent_id существует
        if (isset($category_arr[$parent_id])) {
            foreach ($category_arr[$parent_id] as $value) { //Обходим
                /**
                * Выводим категорию
                *  $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
                */
                echo "<div style=\"margin-left:".($level * 25)."px;\">".$value["name"]."</div>";
                $level = $level   1; //Увеличиваем уровень вложености
                //Рекурсивно вызываем эту же функцию, но с новым $parent_id и $level
                outTree($value["id"], $level);
                $level = $level - 1; //Уменьшаем уровень вложености
            }
        }
    }
    outTree(0, 0);

Важлива інформація

Міністерство оборони
України
з 24.02 по 16.01
втрати противника
орієнтовно склали:
814150 ( +1480 ) особового складу
9791 ( +11 ) танків
20368 ( +20 ) бойових бронемашин
22015 ( +40 ) артилерійських систем
1262 ( +0 ) РСЗВ
1046 ( +0 ) засоби ППО
369 ( +0 ) літаків
331 ( +0 ) гелікоптерів
34132 ( +137 ) автомобільної техніки
28 ( +0 ) кораблі / катери
3049 ( +31 ) крилаті ракети
22503 ( +120 ) БПЛА
3697 ( +1 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни