Создание облака меток на PHP

Задача: создать облако меток (тегов) популярность которых зависит от количества материалов с данной меткой и/или количества просмотров материалов. Результат показан на рисунке ниже:

Облако меток

Исходные данные

Требуется показать 15 меток, разным размером шрифта, случайным порядком. Имеется две таблицы:

Таблица tags

  • id (INTEGER): id-метки
  • title (VARCHAR): отображаемое имя метки
  • alias (VARCHAR): альяс для ссылки на страницу метки

Таблица tags_hits

Данная таблица заполняется отдельном скриптом, раз в час, поскольку меток и материалов может быть очень много, то подсчитывать количество материалов для каждой метки при каждом обновлении страницы может создать дополнительную, не нужную нагрузку.

  • id (INTEGER): id-метки
  • hits (INTEGER): популярность метки (например, количество материалов с данной меткой)

Приступаем к решению

/* -- Получить значение 100% -- */
$query = "SELECT SUM(mytbl.hits) AS sum FROM
         (SELECT hit.hits AS hits FROM `tags_hits` AS hit LEFT JOIN `tags` AS tag ON hit.id=tag.id
              ORDER BY hit.hits DESC LIMIT 15) AS mytbl";
$res = mysql_query($query);
$row = mysql_fetch_array($res);
$sum = $row[sum]; // Количество хитов всех полученных меток

/* -- Сформировать строки -- */
$query = "(SELECT hit.id, hit.hits, tag.title, tag.alias FROM `tags_hits` AS hit
           LEFT JOIN `tags` AS tag ON hit.id=tag.id ORDER BY hit.hits DESC LIMIT 15)
               ORDER BY RAND()";
$res = mysql_query($query);
while ($row = mysql_fetch_array($res)) {
    $sizeMin = 10; // Минимальный размер шрифта в px
    $sizeMax = 18; // Максимальный размер шрифта в px
    $stepTag = 2; // Шаг метки (при какой разнице в процентах увеличивать шрифт на 1px)
    $rateMin = 2; // Минимальный порог, все метки процент которых меньше $rateMin отображаться минимальным шрифтом
    $rateMax = 20; // Максимальный порог, все метки процент которых больше $rateMax отображаться максимальным шрифтом
    $rate = (100 * $row[hits]) / $sum; // Процент хитов метки от общего числа хитов полученных меток
    $stepFont = intval(($rate - $rateMin) / $stepTag) + 1; // На сколько значений увеличить шрифт
    $size = $sizeMin + $stepFont; 
    // Проверяем крайние значения
    if ($size < $sizeMin) $size = $sizeMin;
    if ($size > $sizeMax) $size = $sizeMax;
    $tagz .= '<a style="font-size: ' . $size . 'px" rel="nofollow" href="/tag/' . $row[alias] . '">' . $row[title] . '</a>';
}

echo $tagz;

Добавить комментарий


Защитный код
Обновить