БлогNot. Пишем "облако тегов" на PHP

Пишем "облако тегов" на 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 [13511 просмотров]


теги: программирование php алгоритм

показать комментарии (1)