Создание облака меток на 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;