Бесконечные подкатегории

NiceBro

Создатель
Регистрация
1 Ноя 2012
Сообщения
44
Реакции
25
Мне надо организовать странички с бесконечной вложенностью например: site.com/page1/page2/page3/....../page10..
Подскажите организацию полей в БД и как можно сделать вывод списка этих страниц с учетом иерархии родителей и потомков.
 
поля 'id', 'parent_id', ... + рекурсивная выборка, если Postgresql, то там можно рекурсию в запросе организовать
 
не ясно зачем такая вложенность, при рекурсии достаточно прилично теряем на каждом уровне на просчет пути

Можно сразу сохранять полный путь и родительскую категорию.

Таблица примерно такая:

Код:
ИД, Название, Родитель, Полный просчитанный путь URL, Полный просчитанный путь навигационной цепочки (Хлебных крошек)

Тем самым сохраняем высокую производительность и получаем внешне тоже самое.

Если напишите зачем такая вложенность, тогда можно описать подробнее возможные алгоритмы решения.
 
Тут зависит - может ли одна страничка быть в разных уровнях вложенности. если нет то самый простой вариант - зафигачить в таблице с этими страничками колонку путь (например route), и там писать какую угодно вложенность. Ну и при заходе по некоему адресу просто проверять нет ли такой странички с похожим путем. если нету - уже стандартный обработчик юзать. Если есть закономеронсть форирования этой ссылки - то и связи прямо можно не указывать в бд, а все взвалить на php чтоб само считало. быстрее будет чем рекурсию такую тулить.
 
  • Нравится
Реакции: RORC
Бесконечено ничего не получится постольку поскольку
а) Существуют ограничения на длину строки в браузере
б) Существуют ограничения на количество рекурсивных вызовов функции (и если каждый раз будет вызываться sql запрос, то ограничение окажется существенным)

Но если уж очень надо то:

1) Как было сказано "поля 'id', 'parent_id'" в БД.
2) Выбираем ВСЕ строки таблицы и храним в массиве
3) Рекурсивно обходим массив (while !is_null($parent_id)) и проделываем нужную операцию

Рекомендую - Передавать большой массив со всеми категориями по ссылке (&$my_big_arr) и все же установить дополнительный лимит на вложенность.. Хотя бы 255 =)
 
Спасибо за ответы. Бесконечная вложенность это было образно, ограничение рекурсивной функции по моему 100 вызовов. Мне надо было максимально неограниченная вложенность :) Ясно что никто не будет делать 100 под-категорий. Сохранение пути в отдельное поле бд, я считаю это самым лучшим решение так как выполняется всего 1 запрос в бд. Ну и кому интересно вот построение списка страниц с учетом иерархии.
PHP:
<?php

//$pages = mysql_query('SELECT id, parent, slug FROM pages')

$pages = array(
    0 => array('id' => 0, 'parent' => NULL, 'slug' => 'page1'),
    1 => array('id' => 1, 'parent' =>    0, 'slug' => 'page2'),
    2 => array('id' => 2, 'parent' =>    1, 'slug' => 'page3'), 
    3 => array('id' => 3, 'parent' =>    2, 'slug' => 'page4'),
    4 => array('id' => 4, 'parent' =>    2, 'slug' => 'page5'),
    5 => array('id' => 5, 'parent' =>    3, 'slug' => 'page6'),
    6 => array('id' => 6, 'parent' =>    1, 'slug' => 'page7'),
    7 => array('id' => 7, 'parent' =>    1, 'slug' => 'page8'),
    8 => array('id' => 8, 'parent' =>    3, 'slug' => 'page9'),
    9 => array('id' => 9, 'parent' =>    7, 'slug' => 'page10'),
    10 => array('id' => 10, 'parent' =>    5, 'slug' => 'page11'),
);

foreach($pages as &$page) {
    if(!is_null($page['parent'])) {
        $pages[$page['parent']]['childs'][$page['id']] = &$page;
    }
}

foreach($pages as $id => &$page) {
    if(!is_null($page['parent'])) {
        unset($pages[$id]);
    } 
}

function hierarchy($pages) {
    echo '<ul>';
    foreach($pages as $page) {
        echo '<li>';
        echo $page['slug'];
        if(!empty($page['childs'])) {
            hierarchy($page['childs']);
        } 
        echo '</li>';
    }
    echo '</ul>';
}

hierarchy($pages);
 
  • Нравится
Реакции: RORC
Назад
Сверху