Отображение неограниченной структуры категорий -> Подкатегории -> и т. Д.? - PullRequest
3 голосов
/ 02 июня 2011

Я полагаю, что это довольно распространенное требование для людей, когда речь идет о создании приложений любого типа, которые основаны на сортировке и отображении данных по категориям - любые 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

Поля базы данных: ID Name ParentIDS

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

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

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

Ответы [ 3 ]

1 голос
/ 02 июня 2011

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

1 голос
/ 02 июня 2011

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

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

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

1 голос
/ 02 июня 2011

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

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

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

...