Созонов Алексей

Веб-разработчик

Построение дерева комментариев php

09.08.2015

Таблица category, в которой хранятся данные:

Таблица, в которой хранятся данные

**
 * Метод читает из таблицы 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 видимой в функции
    if (isset($category_arr[$parent_id])) { //Если категория с таким 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);
<?php
/**
 * PHP5 (ООП) 
 * Постоение дерева (меню неограниченной вложености)
 * @author дизайн студия ox2.ru   
 */
class TreeOX2 {

    private $_db = null;
    private $_category_arr = array();

    public function __construct() {
        //Подключаемся к базе данных, и записываем подключение в переменную _db
        $this->_db = new PDO("mysql:dbname=ox2.ru-test-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 outTree($parent_id, $level) {
        if (isset($this->_category_arr[$parent_id])) { //Если категория с таким 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->outTree($value->id, $level);
                $level--; //Уменьшаем уровень вложености
            }
        }
    }

}

$tree = new TreeOX2();
$tree->outTree(0, 0); //Выводим дерево
#PHP