- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Уважаемые, форумчане, помогите разобраться со следующей проблемой:
Есть БД в ней таблица:
Соответственно, на выходе хочу получить дерево разделов с подразделами (т.е делаю скрипт карты сайта), вида:
Пробую запросами к БД, но там выводится все по-порядку и нет разграничений =( Помогите разбораться с проблемкой, заранее спасибо. :idea:
Сам что-то пробовал? Рекурсивную функцию напиши, которая будет посылать запрос к базе, получать список записей данного уровня вложенности, потом пробегать по этому списку и запускать себя снова с новыми параметрами.
я вот так генерю карту:
function gen_map_inside($catId,$inLevel) {
global $SITE_MAP;
$inLevel++;
$q = mysql_query('SELECT `strid`,`parent_id`,`name` FROM `structure` WHERE `type` = 0 AND `active` = 1 AND `parent_id` = '.$catId.' ORDER BY `menu_weight` DESC, `name` ASC;');
$a = 0;
while ($r = mysql_fetch_array($q)) {
$strid = $r['strid'];
if (check_permission($strid)) {
if (!$a) {
$SITE_MAP.= '<ul>';
$a = 1;
}
$SITE_MAP.= '<li><a href="'.get_url_by_id($strid).'">'.stripslashes($r['name']).'</a></li>'."\n";
if ($inLevel <= MAP_INLAY_COUNT) gen_map_inside($strid,$inLevel);
}
}
if ($a) $SITE_MAP.= '</ul>';
}
$SITE_MAP.= '<div id="sitemap">';
$inLevel = $catId = 0;
$q = mysql_query('SELECT `strid`,`parent_id`,`name`,`mod` FROM `structure` WHERE `type` = 0 AND `active` = 1 AND `parent_id` = '.$catId.' ORDER BY `menu_weight` DESC, `name` ASC;');
$a = 0;
while ($r = mysql_fetch_array($q)) {
$strid = $r['strid'];
if (check_permission($strid)) {
if (!$a) {
$SITE_MAP.= '<ul>';
$a = 1;
}
$SITE_MAP.= '<li><a href="'.get_url_by_id($strid).'">'.stripslashes($r['name']).'</a></li>'."\n";
if ($inLevel <= MAP_INLAY_COUNT && $r['mod'] != 'lists') gen_map_inside($strid,$inLevel);
}
}
if ($a) $SITE_MAP.= '</ul>';
$SITE_MAP.= '</div>';
если особо не париться со скоростью и оптимизацией, то примерно так:
зачем такие простые вещи делать рекурсивно? Нужно экономить ресурсы, если только на этот блок потратится 10-30 запросов, а таких блоков на странице 10-20? Вот так и появляется новая статья расходов "оперативная память сервера", вместо оптимизации запроса.
Обычно, если вложенность неограниченна, проще вытащить нужные данные одним запросом, разложить их по массивам, и с ними уже работать. В одном массиве - информация о parent'e вида $Array[$pid][$id], получая id разделов - из другого массива получаем остальные данные по $id и рисуем карту ($Pages[$id]['name'], $Pages[$id]['url'] и т.п.).
Если карта строго двухуровневая (по примерам, которые приводятся авторами в подобных темах, нихрена не угадать, что же он конкретно имел в виду), а с массивами возиться не хочется - то можно просто вытащить информацию о втором уровне (WHERE pid<>0 ORDER BY pid,id), а название родителя подцепить в тот же запрос через LEFT JOIN, и вывести так, как я предлагал в соседнем топике.
все уже обсуждалось много раз /ru/forum/272462
Скажу так, моего опыта маловато, чтобы понять =)
Подумал про идею, если считать запрос к БД в массив, слышал, что есть массивы с ключами.
А потом из массива вытаскивать нужное, т.е если есть подразделы, то сначала вывести элемент массива с разделом-родителем, а затем найти элементы подразделов. И все это вывести, и так до тех пор пока не дойду до последнего элемента.
Только как это реализовать?
Изучайте код, $list - это полный список категорий вида [id_category] => array('id_parent' => .., 'name' => ..) ... на оптимальность не претендует, но работает шустренько
если записей немного, согласен с DenIT, что проще, думаю и быстрее, в массив выбрать все и разобрать
Если не хочешь переделывать структуру БД, то поможет stored procedure.
Если есть желание подолбаться и сделать по-человечески, то придётся разбираться с Nested Sets.
Почитать можно здесь, например: http://phpclub.ru/detail/article/db_tree
Способы с пачкой запросов или полной вычиткой дерева с дальнейшим разбором - это кошерно только на очень маленьких деревьях. Если это меню, то прокатит. Если что-то большее, придётся поработать головой.