Приветствую всех уважаемых завсегдатаев данного форума! На этапе модернизации своего сайта столкнулся с проблемой динамического создания глоссария терминов. Хотелось бы попросить помощи у знающих, ибо сам я пока эту проблему не осилил. Итак, что мы имеем: 1. Есть таблица кулинарных терминов. Пример записи: Код (Text): id | letter | rusletter | title | text ---------------------------------------------------------------------- 1 | v | в | Виноград | <...описание винограда...> 2 | zh | ж | Желатин | <...описание желатина...> Всего записей в таблице терминов - 329. Само собой, что выбрать их из базы и вывести последовательно - не проблема. Что я и делаю: Этот список уже отсортирован так, как мне надо. Он был получен следующим запросом: [sql]SELECT `id`, `letter`, `rusletter`, `title` FROM `glossary` ORDER BY `rusletter`, `title` ASC[/sql] Задача состоит в следующем: 1. Выбрать эти данные из базы в массив (ну, не делать же отдельные запросы в базу по каждой букве? ) 2. Вывести их вертикально в 3 колонки (без таблиц, на div-ах), колонки должны быть примерно равной высоты (+/- 1-2 строки) 3. Подписать букву перед терминами, начинающимися со следующей буквы В идеале, что хотелось бы получить: Причём, выведено это должно быть в 3 колонки примерно одинаковой высоты (здешнее форматирование bbcode не позволяет мне так нарисовать). Примечание: формат пермалинка на глоссарий у меня следующий: 'glossary/zh/2/' То есть, /glossary/<letter-из-базы>/<id-из-базы>/' Поэтому, в двумерный массив придётся запихивать все элементы, кроме текста (значения) термина. Если кто-то уже делал подобную задачу - буду благодарен за пример кода, по которому смогу разобраться. В принципе, готов заплатить за грамотный и понятный (и, главное - рабочий!) код. Спасибо!
PHP: <?php // ... $columns = 3; $sql = 'SELECT `id`, `letter`, `rusletter`, `title` FROM `glossary` ORDER BY `rusletter`, `title` ASC'; $res = mysql_query($sql) or mysql_error($sql . '<br />' . mysql_error()); $glossary = array(); if(mysql_num_rows($res) > 0) { while($row = mysql_fetch_assoc($res)) $glossary[] = $row; } $total = count($glossary); $inColumn = (int) ceil($total / $columns); ?> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=Windows-1251" /> <title>Кулинарные штуки всякие</title> </head> <body> <?php $prev = ''; for($i = 0; $i < $columns; $i++) { $first = true; ?> <div style="float: left;"> <?php $start = $inColumn * $i; $stop = ($i === ($columns - 1)) ? $total : ($start + $inColumn); for($n = $start; $n < $stop; $n++) { if($glossary[$n]['rusletter'] !== $prev) { $prev = $glossary[$n]['rusletter']; if(!$first) echo('<br />'); ?> <b><?php echo($glossary[$n]['rusletter']); ?></b><br /> <?php } $first = false; ?> <a href="glossary/<?php echo($glossary[$n]['letter']); ?>/<?php echo($glossary[$n]['id']); ?>/"><?php echo($glossary[$n]['title']); ?></a><br /> <?php } ?> </div> <?php } ?> </body> </html> Посмотри, может устроит.
igordata ? Ты про кашу из html и php? Мне так вполне даже удобно. Здесь просто подсветка всё-таки ещё не супер. В том же NotePad++ я сразу чётко вижу, где php, где html. Если SkyKiller захочет - отформатирует как ему удобнее. Так я обычно пишу в каких-то мелких "сайтиках с фончиками". Если что-то покрупнее - обычно использую xTemplate.
Добавлю ещё, почему я часто так пишу. Если это смотреть в Notepad++, то он подсветит как html, так и php. Одно подсветит по своим правилам, другое по своим. Если использовать просто echo, то html подсвечен не будет, всё будет просто сереньким (строка текста в кавычках). А так и подсветка html (теги, атрибуты, значения) и для каждого тега, у которого есть пара - очень быстро эту пару найти можно. Если всё в echo, то парные теги тоже не будут подсвечиваться и находиться.