Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 29.09.2010
Сообщений: 18

Проектирование структуры таблицы и фунция вывода дерева категорий

18.10.2014, 11:12. Показов 2354. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть необходимость отображать в древовидном виде структуру категорий определенных товаров на
сайте интернет магазина. Предполагается, что на сайте может отображаться не все дерево категорий
товаров, а только его часть (одна из веток). Нужно спроектировать структуру таблицы для хранения
дерева категорий и написать небольшую функцию, которая выведет ветку категорий в виде HTML-списка.
Входным параметром для функции должен быть идентификатор категории, с которой необходимо
построить ветку.

Получилось реализовать данную задачу через рекурсивную функцию.
Но для того, чтобы выводилась одна из веток нужно указывать id и id_parrent в sql-запросе, а по заданию входным параметром должен быть id категории, с которой нужно построить ветку. Как это реализовать?

Таблица categories:

Название: таблица categories.JPG
Просмотров: 113

Размер: 15.2 Кб


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
mysql_connect("localhost", "root"); //Подключаемся к базе данных
mysql_select_db("monastirev2"); //Выбираем базу данных
 
/**
 * Метод читает из таблицы categories все сточки, и 
 * возвращает двумерный массив, в котором первый ключ - id родителя 
 * категории (parent_id)
 
 */
function getCategory() {
    $query = mysql_query("SELECT * FROM `categories` where (id=1 or parent_id=1)");
    $result = array();
    while ($row = mysql_fetch_array($query)) {
        $result[$row["parent_id"]][] = $row;
    }
    return $result;
}
 getCategory();
//В переменную $category_arr записываем все категории
$category_arr = getCategory();
 
/**
 * Вывод дерева
 * @param Integer $parent_id - id-родителя
 * @param Integer $level - уровень вложенности
 */
function print_categories($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
            print_categories($value["id"], $level);
            $level = $level - 1; //Уменьшаем уровень вложенности
        }
    }
}
 
print_categories(0, 0);
?>
Результат:
Название: результат.JPG
Просмотров: 113

Размер: 9.8 Кб
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2014, 11:12
Ответы с готовыми решениями:

Обработка дерева категорий
Здравствуйте, есть таблица с категориями( ее структура на картинке ). Построить само дерево исходя из id и parent_id у меня...

Реализация дерева категорий
Доброго времени суток! На просторах интеренета нашел функцию по реализации дерева категорий. Но при её разборе, так окончательно и не...

Квадратичная фунция для хэш-таблицы
Добрый день! Подскажите, что тут c1, c2, h'(key)? Задание прикрепил картинкой.. А ниже функция, которая дана в задании.. int...

7
5 / 5 / 0
Регистрация: 29.09.2010
Сообщений: 18
18.10.2014, 12:03  [ТС]
Извиняюсь за опечатку в заголовке.
0
Марсианин
 Аватар для MarlboroRed
87 / 87 / 22
Регистрация: 11.10.2012
Сообщений: 333
19.10.2014, 01:07
PHP
1
$query = mysql_query("SELECT * FROM `categories` where (id=1 or parent_id=1)");
А зачем по паренту еще искать? Насколько я понял задание нужно найти категорию с определенной idхой, узнать ее парент, найти категорию с id == parent_id предыдущей категории и т.д. пока не дойдем по категории в которой parent_id == 0
0
5 / 5 / 0
Регистрация: 29.09.2010
Сообщений: 18
19.10.2014, 13:48  [ТС]
Спасибо за ответ.
Потому-что если просто при вызове функции указать parent_id, н-р, 1, то выводится ветка с подкатегориями первой категории, а сама корневая категория нет, т. е., если
PHP
1
$query = mysql_query("SELECT * FROM `categories` where (id=1 or parent_id=1)");
поменять на
PHP
1
$query = mysql_query("SELECT * FROM `categories` ");
, а
PHP
1
print_categories(0, 0);
на
PHP
1
print_categories(1, 0);
, то получим только подкатегории первой категории.

Цитата Сообщение от MarlboroRed Посмотреть сообщение
А зачем по паренту еще искать? Насколько я понял задание нужно найти категорию с определенной idхой, узнать ее парент, найти категорию с id == parent_id предыдущей категории и т.д. пока не дойдем по категории в которой parent_id == 0
Очень бы хотела понять как именно это сделать...
0
Марсианин
 Аватар для MarlboroRed
87 / 87 / 22
Регистрация: 11.10.2012
Сообщений: 333
19.10.2014, 15:02
Лучший ответ Сообщение было отмечено _olovo_ как решение

Решение

Цитата Сообщение от _olovo_ Посмотреть сообщение
Очень бы хотела понять как именно это сделать...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$result = array();
function getCategoryThree($id, $result){
    $query = mysql_query("SELECT * FROM `categories` where (id=".$id.")");
    
   $row = mysql_fetch_row($query);
   
   $result[]["name"] = $row[1];
   if ($row[2]!="0")
   {
       return getCategoryThree($row[2], $result);
   }
   
   return $result;
}
 
$current_cat_id = 5;
$result = getCategoryThree($current_cat_id, $result);
 
$result = array_reverse($result);
 
var_dump($result);
PHP
1
$current_cat_id = 5;
это я для примера. В эту пременую вам нужно записать id текущей категории

Добавлено через 12 минут
спрашивайте, что не ясно - объясню
1
5 / 5 / 0
Регистрация: 29.09.2010
Сообщений: 18
19.10.2014, 18:10  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$result = array();
function getCategoryThree($id, $result){
   $query = mysql_query("SELECT * FROM `categories` where (id=".$id.")");
   $row = mysql_fetch_row($query);
   $result[]["name"] = $row[1];
   if ($row[2]!="0")
   {
       return getCategoryThree($row[2], $result);
       
   }
   
   return $result; 
}
$current_cat_id = 2;
$result = getCategoryThree($current_cat_id, $result);
$result = array_reverse($result);
var_dump($result);
Выводит:
array(1) { [0]=> array(1) { ["name"]=> string(20) "Категория 2" } }

Пробовала вставить getCategoryThree () в function print_categories. Не выходит.
Как получить древовидный список из этого дампа?
0
Марсианин
 Аватар для MarlboroRed
87 / 87 / 22
Регистрация: 11.10.2012
Сообщений: 333
19.10.2014, 22:57
Цитата Сообщение от _olovo_ Посмотреть сообщение
$current_cat_id = 2;
все верно, судя из вашей таблицы, категория 2 не имеет родителей. По-этому только она и записалась в древо.

Цитата Сообщение от _olovo_ Посмотреть сообщение
Как получить древовидный список из этого дампа?
Этот дамп и есть древо. Первый его элемент - это самая высшая категория, 2й это его "ребенок" и т.д.

Рекурсивная ф-ция getCategoryThree берет категорию и ищет ее родителей и родителей родителей и т.д. пока не найдет категорию которая не будет иметь родителей.
Насколько я понял это и требовалось

Цитата Сообщение от _olovo_ Посмотреть сообщение
Пробовала вставить getCategoryThree () в function print_categories. Не выходит.
я скопировал этот скрипт из одного своего проекта. Он не может подходить под вашу функцию. Но зная как построено дерево (я вам объяснил выше) вы можете легко его вывести и без такой большой функции.
1
5 / 5 / 0
Регистрация: 29.09.2010
Сообщений: 18
20.10.2014, 00:43  [ТС]
Спасибо за такой подробный ответ. Очень доходчиво =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2014, 00:43
Помогаю со студенческими работами здесь

Удаление дерева категорий
Доброго времени суток всем, у меня возникла такая проблема: В БД у меня есть таблица категорий и подкатегорий (category) В ней...

Создание дерева категорий
Здравствуйте, хочу спросить. Мне нужно сделать программу, где есть некие товары в виде структуры. Я хочу сделать дерево категорий этих...

Рекурсия: формирование дерева категорий
Задача сформировать дерево категорий. Не могу додуматься, как создать рекурсию данного кода: for($i = 0; $i &lt;...

Код для дерева категорий
Привет, есть такой код для дерева категорий INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES (1, 0, 'Раздел 1'), (2, 0,...

Фунция отслеживание изменения времени записи файла и вывода значений из того же файла
Здравствуйте! Возникла проблема, нужно разработать функцию, которая будет вызываться в основной программе. Задачи функции - мониторить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru