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

Зачем быть уникальным в мире, где все можно скопировать
Почему так важна уникальность текста и как она влияет на SEO
Ingate Organic
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Собственно, наверное, самая распространённая проблема...
Я с ней сталкиваюсь в первый раз, прошу не судить строго. Просто требуется небольшая наводка.
Итак, что есть: есть таблица разделов и подразделов. Никаких left_id, right_id и тому подобных вещей нет. В разделах есть ID, и название. В подразделах - ID, ID родительского раздела, название подраздела.
Что требуется:
Вывести дерево разделов и подразделов. Вложенность только до 2 уровня. Т.е. картинка примерно такая:
Мой вопрос, наверное, в том, как правильнее организовать SQL-запрос к базе таким образом, чтобы на выходе получился массив, который будет пригоден для построения дерева... вот.. как-то так...
Всем заранее спасибо за помощь :)
первое поле [ID ключ] - идентификатор записи (элемента), последнее поле внешний ключ [V_ID] - показывает родителя элемента - если не знаешь что такое внешний ключ - почитай - рассказывать долго
имееем
1 - папка1 - 0
2 - файл - 1
3 - файл - 1
4 - папка2 - 0
5 - файл - 4
6 - файл - 1
7 - файл - 4
и так далее
если внешний ключ не задан или равен ноль (3я колонка) это корневая папка - эт сам придумаешь как лучше
это толчок а не прям разжовывание.... (неограниченную вложенность тоже сам додумаешь ....)
что мешает сделать вложенный цикл
mysql_query("SELECT * from table_разделы WHERE id_родителя=$i");
for($i=0;$i<count(массив_разделов_из_базы_разделов);$i++){
echo "Раздел ".$i."<br />";
mysql_query("SELECT * from table_подразделов WHERE id_родителя=$i");
for($j=0;$j<count(массив_записей_из_предыдущего_mysql_query);$j++){
echo "подраздел ".$j;
}
}
типа такого
что мешает сделать вложенный цикл
mysql_query("SELECT * from table_разделы WHERE id_родителя=$i");
for($i=0;$i<count(массив_разделов_из_базы_разделов);$i++){
echo "Раздел ".$i."<br />";
mysql_query("SELECT * from table_подразделов WHERE id_родителя=$i");
for($j=0;$j<count(массив_записей_из_предыдущего_mysql_query);$j++){
echo "подраздел ".$j;
}
}
типа такого
Сдохнет ваш сервер от такого количества запросов к бд. Если делать рекурсию, то лучше сначала один раз достать все данные в массив и оперировать им (но тут тоже зависит от того какой массив получится).
А вообще для php есть библиотеки для работы с деревьями в бд. Сам не использую, но видел не один раз.
В гугле искать Adjacency List, Nested Sets
В общем вывел сам. Пока ещё не вывел, просто сформировал требуемую структуру в php. Кому интересно - выкладываю код и пояснения.
Кратко о том, что здесь происходит.
$cs - это общий массив, где всё хранится. Сначала первым циклом while выводим все разделы и помещаем их в массив. Получаем двумерный массив.
Далее, поскольку массив двумерный, у нас идёт двойной цикл foreach (поскольку $value является массивом, который также необходимо обработать).
Создаём ключ массива name, который также преобразуем в массив. И по условию наличия подразделов ($rows > 0) выводим соответственно разделам. Получается на первый взгляд не очень удобоваримая структура, но smarty с ней справится :))
Ragnarok
Отвечаю на ваше сообщение. Так делать мне нельзя, поскольку у меня всё основано на шаблонах, и очень не хочется html код переводить в файлы php.
Вот что получилось в результате:
Array
(
[0] => Array
(
[1] => Array
(
[0] => Первый раздел
[name] => Array
(
[subcat_id] => 5
[subcat_name] => Ещё один подраздел в первом разделе
[parent_cat_id] => 1
)
)
)
[1] => Array
(
[2] => Array
(
[0] => Второй раздел
[name] => Array
(
[subcat_id] => 6
[subcat_name] => Ещё один подраздел вo втором разделе
[parent_cat_id] => 2
)
)
)
[2] => Array
(
[3] => Array
(
[0] => asafasf
[name] => Array
(
)
)
)
[3] => Array
(
[4] => Array
(
[0] => asf
[name] => Array
(
)
)
)
[4] => Array
(
[5] => Array
(
[0] => 111www
[name] => Array
(
)
)
)
[5] => Array
(
[6] => Array
(
[0] => Новый раздел без описания
[name] => Array
(
)
)
)
[6] => Array
(
[7] => Array
(
[0] => Новый раздел с описанием
[name] => Array
(
)
)
)
)
ЭЭ, вас количество запросов в подобном цикле не смущает?
Не проще сделать нечто вроде
?
Counselor
Мне всё это дело потом распарсивать в Smarty.
Ко всем:
Вот Smarty-код, который корректно обрабатывает это дело, выводит в виде нормальной таблички.
Counselor
Мне всё это дело потом распарсивать в Smarty.
Какая разница куда?
запрос:
сбор данных:
вывод (я не помню навскидку как в смарти работать со вложенными массивами, код на пхп)
ps: писал прям тут в редакторе, могут быть ошибки в коде, но думаю суть ясна.
Вот на такую конструкцию:
неоднократно получал Fatal error: cannot use [] for reading
Вот на такую конструкцию:
неоднократно получал Fatal error: cannot use [] for reading
А какая у вас версия пхп? По идее эта ошибка возникает, когда пытаешься прочитать массив, не указывая ключ, а не записываешь в него.
Проверил у себя:
Кстати такие узкие места можно обойти просто кешем. Первый раз создаем хтмл код как угодно, хоть даже большим количеством запросов, потом толкаем этот код в БД, в поле типа blob, так же нужно как минимум еще время, когда кеш необходимо обновить. И все, получаем кеш и время, если еще действителен, просто выводим его. Конечно еще нужно предусмотреть сброс кеша, ну это уже мелочи. Получается даже быстрее, чем длинный запрос к БД, а потом его обработка через foreach.