ФорумПрограммированиеPHP для идиотов → Определение id страницы по url'у

Определение id страницы по url'у

  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 10 августа 2008 г. 6:25

    Есть функция, которая возвращает id страницы, парся url.
    $page_path — url (например, /category/subcategory/page.html)
    $parent_id — id родительской категории
    $_MAIN['categories'] — все категории (результать mysql запроса)
    $_MAIN['pages'] — все страницы (результать mysql запроса)
    function page_id($page_path, $parent_id = 0)
    {
       global $_MAIN;
       $page_copy = explode('/', $page_path); // парсим урл
       $parent_id = intval($parent_id);
       foreach ($page_copy as $segment)
       {
           if (!preg_match('#\.html$#i', $segment)) // если вызывается не страница
           {
               foreach ($_MAIN['categories'] as $category)
               {
                   if (($category['parent_id'] == $parent_id) and ($category['category_name'] == $segment)) // если id категории равно id родителя и имя категории равно сегменту урл
                   {
                       page_id($page_path, $category['category_id']); // рекурсия
                       $_MAIN['page']['id'] = $category['index_id']; // результат — id страницы
                   }
               }
           }
           else
           {
               $segment = preg_replace('#\.html$#i', '', $segment);
               foreach ($_MAIN['pages'] as $page)
               {
                   if (($page['category_id'] == $parent_id) and ($page['page_name'] == $segment))
                   {
                       $_MAIN['page']['id'] = $page['page_id'];
                   }
               }
           }
       }
    }

    Сейчас функция использует массив ВСЕХ страниц из MySQL. Так как страниц может быть много, то массив может занимать много памяти. Можно ли как то оптимизировать функцию? Есть идея по выносу имен категорий и страниц в отдельную таблицу.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 августа 2008 г. 6:59, спустя 33 минуты 30 секунд

    ׳, мда, жесть.

    Используй "Adjacency List" или "Nested Sets" и желательно хранить в таблице только зависимости, а имена разделов в другой таблице. Вот, можешь заюзать для Nested Sets: http://php.russofile.ru/ru/authors/sql/nestedsets01

    http://phpclub.ru/detail/article/2002-06-03
    http://phpclub.ru/detail/article/db_tree
    http://phpclub.ru/faq/Tree?v=w5u
    adw/0
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 10 августа 2008 г. 8:38, спустя 1 час 39 минут 12 секунд

    Тоесть лучше использовать nested sets вместо простого parent_id? Сама задача — организация структуры сайта.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 10 августа 2008 г. 21:34, спустя 12 часов 56 минут 23 секунды

    ׳, не parent_id, а Adjacency List.
    И не лучше, а смотри сам что для тебя подходит. Если что-то не очень большое (по кол-ву элементов) и не много вложений, то делай Adjacency List.
    adw/0
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 11 августа 2008 г. 4:52, спустя 7 часов 17 минут 41 секунду

    Для структуры сайта что будет лучше? Я выбрал то, что проще — Adjacency List. А кто что использует?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 11 августа 2008 г. 7:35, спустя 2 часа 43 минуты 16 секунд

    ׳, ты брат то что ты знаешь а не то что проще)))
    я использую смесь Adjacency List и Nested Sets
    к материяльным путям у меня дуща не лежит (после http://neocrome.ru/) но думаю для коментов деревцем они подходят весьма неплохо

Пожалуйста, авторизуйтесь, чтобы написать комментарий!