Облако тегов в линию

Сегодня будем рассматривать такую задачку как генерация облака тегов. Мы все конечно не раз встречали это облако на других сайтах и блогах, но не все задумывались над реализацией этого облака на php. Общие моменты ясны из определения с wiki: "визуальное представление списка ярлыков (или категорий). Частота упоминаний, поисков, ссылок в интернете с определенного сайта неких слов, терминов, имен, отображается на специальной странице в виде изображения этих слов в формате гиперссылок. Размер изображения тем больше, чем выше релевантность данного слова (термина, имени)".

Релевантность в нашем случае определяется количеством вхождений одного тега в их общую массу.
Учитывая все вышесказанное, весь алгоритм построения облака тегов можно разделить на 2 этапа:

  1. Генерация списка пар Тег-Количество вхождений
  2. Вывод облака с учетом релевантности тегов

1-я задача решается довольно просто с технической точки зрения. 2-я тоже, но здесь возможны вариации.

Ниже приведу небольшой класс, который написан для генерации облака тегов.

  1. <?class TagsCloud{
  2. private $tags;
  3. private $font_size_min=14;
  4. private $font_size_step=5;
  5. function __construct($tags){
  6. shuffle($tags);
  7. $this->tags=$tags;}
  8. private function get_tag_count($tag_name, $tags){
  9. $count = 0;
  10. foreach ($tags as $tag){
  11. if ($tag == $tag_name){
  12. $count++;}}
  13. return $count;}
  14. private function tagscloud($tags){
  15. $tags_list = array();
  16. foreach ($tags as $tag){
  17. $tags_list[$tag] = self::get_tag_count($tag, $tags);}
  18. return $tags_list;}
  19. private function get_min_count($tags_list){
  20. $min = $tags_list[$this->tags[0]];
  21. foreach ($tags_list as $tag_count){
  22. if ($tag_count < $min) $min = $tag_count;}
  23. return $min;}
  24. public function get_cloud(){
  25. $cloud = Array();
  26. $tags_list = self::tagscloud($this->tags);
  27. $min_count = self::get_min_count($tags_list);
  28. foreach ($tags_list as $tag=>$count){
  29. $font_steps = $count - $min_count;
  30. $font_size = $this->font_size_min + $this->font_size_step * $font_steps;
  31. $cloud [] = "<span style='font-size:".$font_size."px'>".$tag."</span>";}
  32. return $cloud;}} ?>

Работать с этим классом примерно так:

  1. <?php $tags = array(
  2. 'ajax', 'javascript', 'php', 'dojo',
  3. 'ajax', 'jquery', 'seo', 'seo',
  4. 'php', 'blog', 'ajax', 'php',
  5. 'html', 'css', 'ajax', 'javascript',
  6. 'css', 'jquery', 'php', 'smo'
  7. );
  8. $mycloud = new TagsCloud($tags);
  9. $tags_list = $mycloud->get_cloud();
  10. foreach ($tags_list as $tag){echo $tag.' ';} ?>

Второй этап построения облака тегов (вывод облака) заключается в преобразовании показателя релевантности (количество вхождений) в размер шрифта результирующей надписи.

В классе это реализовано следующим образом: в настройках задается минимальный размер шрифта, который соответствует минимальному уровню релевантности (одно вхождение). Все теги с большей релевантностью имеют размер на столько пикселей больше, на сколько больше они имеют вхождений. Шаг изменения можно задавать полем font_size_step, а минимальный размер шрифта полем font_size_min.

Работает только с латиницей по размеру шрифта, и кодировка не помогает (это огромный минус), зависит от индивидуальных настроек сервера хостера (может и не сработать из-за устаревшей версии, что вы тут и наблюдаете).

Скачать скрипт можно тут.