Пишем "облако тегов" на PHP
Как вывести на сайте теги или ключевые слова разными размерами шрифта, чтобы чем популярнее тег, тем больше был размер слова, но не до бесконечности, а в каких-то заданных пределах?
Уф, трудней всего было перевести вопрос на приемлемый русский :)
Действительно, "облака тегов" есть на большинстве современных сайтов, имеют они самый разный вид, от красивых крутящихся "флешек" до обычного "поля слов", как в этом блоге. Вся фишка в том, чтобы более популярные слова выводились большим размером шрифта, но процесс этот не мог зайти слишком далеко и был заранее ограничен какими-то заданными программистом рамками :) Нам вполне хватит нескольких строчек кода из исходника этого блога, которые мы ещё упростим.
Понадобятся всего 3 настройки:
define ("TAGSLEVEL","10"); //Сколько разных размеров текста допускаем define ("BASEFONT","8"); //Размер для вывода текста "нулевого уровня" (в пунктах) define ("PTSTEP","1"); //Каждый следующий уровень на PTSTEP пунктов больше
То есть, мы различаем не более 10 разных размеров шрифта, текст никогда не будет меньше 8 и больше
BASEFONT+PTSTEP*TAGSLEVEL
= 18 пунктов.
Предположим, что интересующая нас информация хранится в таблице tags
со следующей структурой:
CREATE TABLE tags ( name varchar(32), #Название тега, ключевое слово rating int #Рейтинг, мера популярности или значимости тега );
Разумеется, в таблице могут быть другие поля, но они для нас сейчас несущественны.
Сначала узнаем, каков максимальный из существующих "рейтинг" тега:
$data = mysql_fetch_array(mysql_query("select max(rating) from tags")); $max=$data[0];
Теперь выберем все теги и в типовом цикле обработки сформируем облако. Размер каждого тега-слова будет
задаваться
конструкцией вида <span style="font-size: 10pt;">слово</span>
, то есть, обычными средствами HTML.
Получится примерно такой код:
$sql='select * from tags'; $result = mysql_query($sql); if ($result and mysql_num_rows($result)) { while ($tag = mysql_fetch_assoc($result)) { $size = BASEFONT; if ($max > 0) $size += PTSTEP * round ($tag['rating'] * TAGSLEVEL / $max); print '<span style="font-size: '.$size.'pt;">'.htmlspecialchars($tag['name']).'</a></span> '; } }
Всё дело, конечно, в формуле для вычисления размера текста $size
по рейтингу тега $tag['rating']
. Пояснить её легко. В общем виде
значение x
, принадлежащее исходному интервалу [a,b]
, можно линейно преобразовать в значение y
, принадлежащее
выходному интервалу [c,d]
, по формуле:
Если каждый
очередной рейтинг принадлежит интервалу [0,$max]
(исходный интервал),
а нам надо "перегнать" его в размер текста, принадлежащий интервалу
[BASEFONT,BASEFONT+TAGSLEVEL*PTSTEP]
(выходной интервал), то, подставив значения в формулу, получаем
BASEFONT + ($tag['rating']-0)*(BASEFONT+TAGSLEVEL*PTSTEP-BASEFONT)/($max-0)
или, после сокращения и округления (ведь все размеры шрифта в пунктах - целые числа), видим то, что написано в коде.
25.08.2011, 15:23 [13597 просмотров]