Pull to refresh

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

Reading time3 min
Views2.3K
Просто навеяно топиком — 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:
Hubs:
Total votes 8: ↑5 and ↓3+2
Comments12

Articles