8 August 2008

Облако тегов на PHP+MySQL

Lumber room
Просто навеяно топиком — habrahabr.ru/blog/php/48543.html#habracut

Все просто до невозможности. Это пример вывода облака тегов к фотографиям. Код не совершенен, алгоритм тоже простенький. Но результат получается довольно кошерный.

Теги хранятся в талице в виде — id | текст

CREATE TABLE `users_tags` (
`id` int(11) unsigned NOT NULL auto_increment,
`text` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `txt` (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


А это таблица связи.

CREATE TABLE `users_fun_photos_tags_data` (
`photo_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned default NULL,
KEY `tag_id` (`tag_id`),
KEY `photo_id` (`photo_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Это таблица где сидят сами фотографии

CREATE TABLE `users_fun_photos` (
`id` int(11) unsigned NOT NULL auto_increment,
`title` varchar(255) default NULL,
`tags` varchar(255) default NULL, /* здесь сидят теги к фото в виде строки, где теги разделены запятой */
`cat_id` int(11) unsigned NOT NULL default '1',
`file` varchar(30) default NULL,
`dir` varchar(3) default NULL,
`user_id` int(11) unsigned default '1',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`date_last_comment` datetime default NULL,
`comments` int(11) unsigned NOT NULL default '0',
`views` int(11) NOT NULL default '0',
`points` int(11) default '0',
PRIMARY KEY (`id`),
KEY `views` (`views`),
KEY `user_id` (`user_id`),
KEY `comments` (`comments`),
KEY `cat_id` (`cat_id`),
KEY `title` (`title`),
KEY `tags` (`tags`),
KEY `date` (`date`),
KEY `date_last_comment` (`date_last_comment`),
KEY `points` (`points`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Ну а вот собственно функция которая выводит само облако

function GetAllTagsFromDB()
{
# Это мое, у вас может отличаться
global $prefix, $dbi;

$data = NULL; # Тут будут выходные данные
$list_tags = array(); # Тут будет текст тегов
$list_ids = array(); # Тут id тегов

# Указывам максимальный и минимальный размер шрифта
$max_size = 300; # Максимальный размер шрифта в процентах
$min_size = 100; # Минимальный размер шрифта, так же в процентах

# Выбираем данные где quantity — сколько раз встречается тег, tag_text — текст и tag_id — id тега соответственно
$res = sql_query(«SELECT COUNT(a.photo_id) AS quantity, b.text, b.id from „.$prefix.“_users_fun_photos_tags_data a, „.$prefix.“_users_tags b where a.tag_id=b.id group by a.tag_id», $dbi);
while(list($quantity, $tag_text, $tag_id) = sql_fetch_row($res))
{
$list_ids[$tag_id] = $quantity; # Добавляем id тегов в массив
$list_tags[$tag_id] = $tag_text; # Добавляем текст тега в массив
# Обратите внимание на то что ключом массива является id тега
}

# Сортируем масив тегов
asort($list_tags);

# Проверяем если массив не пустой
if (!empty($list_tags))
{
# Выбираем максимально и минимальное значение quantity
$max_qty = max(array_values($list_ids));
$min_qty = min(array_values($list_ids));

# Вычисляем разницу между максимальным и минимальным quantity
$difference = $max_qty — $min_qty;
# На ноль делить нельзя
if (0 == $difference)
{
$difference = 1;
}
# Высчитываем шаг увеличения размера шрифта
$step = ($max_size — $min_size)/($difference);

# Проходимся по массиву тегов
foreach ($list_tags as $key => $value)
{
# Вычисляем будущий размер шрифта
$size = ceil($min_size + (($list_ids[$key] — $min_qty) * $step));

$data .= '<a style=«font-size:'.$size.'%» href=«index.php?section=Fun&file=search&tag_id='.$key.'»>'.$list_tags[$key].'</a> ';

}
}
return $data;
}
* This source code was highlighted with Source Code Highlighter.
Tags:phpmysqlоблако теговтеги
Hubs: Lumber room
+2
979 19
Comments 12