Отображение неограниченной структуры категорий - > Подкатегорий - > и т. Д.?


Я полагаю, что это довольно распространенное требование для людей, когда дело доходит до создания любого приложения, которое основывается на сортировке и отображении данных в категориях - любых CMS/Форумах/тележках и т. Д., И я рвал на себе волосы, пытаясь придумать способ показать все категории и их детей безрезультатно - лучшее, что мне удалось, - это цикл while в цикле while (сколько бы уровней, я думаю, мне может потребоваться), но это противоречит смыслу программирования, на мой взгляд, это должно быть легко расширяемый.

Итак, учитывая:

Category 1
-Sub cat
-Sub cat
--Sub sub cat
--- Sub sub cat
-- Sub sub cat
-Sub cat
Category 2
-Sub cat
-Sub cat
--Sub sub cat
---sub sub sub cat
----sub sub sub sub cat
-sub cat
Category 3
-Sub cat

Поля базы данных: Идентификаторы родительских имен

Как бы вы повторили каждую из категорий в их иерархии из базы данных?

Я бы опубликовал свой код, но, очевидно, он массивный, учитывая длинный способ вложенности циклов.

Я думал о написании фрагментов кода, которые находят "глубину" дерева категорий, но это все еще не сокращает его.. идеи?

Author: Anonymous, 2011-06-02

3 answers

Структура, о которой вы говорите, по сути, представляет собой дерево. Повторение по дереву относительно просто, если вы используете рекурсию. Я не знаю, какой код доступа к базе данных вы используете, но вы должны быть в состоянии соответствующим образом экстраполировать из следующего psuedocode:

function iterate_tree(arr) {
    foreach (item in arr) {
        print item;
        iterate_tree(item.children);
    }
}

На английском языке это означает печать элемента в списке, затем печать его дочерних элементов, и как только все дочерние элементы (и их дети) напечатаны, переходите к следующему элементу в списке.

 1
Author: Josh Smeaton, 2011-06-02 10:45:37

В качестве подсказки вы могли бы использовать рекурсию. Общая идея доступна по адресу http://en.wikipedia.org/wiki/Recursion . Т.е. вы пишете функцию, которая захватывает и отображает все файлы и папки в текущей папке. Затем вы повторно применяете одну и ту же функцию для каждой вложенной папки в одном и том же цикле рекурсии. И т. д. и т. д.

 1
Author: Parap, 2011-06-02 10:42:12

На веб-сайте mysql есть довольно хороший учебник.

Http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql / Переходите к The Nested Set Model, если хотите прочитать интересную часть

Честно говоря, я не думаю, что есть какой-либо другой/лучший способ хранения иерархических данных.

 1
Author: dynamic, 2011-06-02 11:03:13