Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Алгоритм создания облака тегов
 
 автор: Stifter2   (17.04.2009 в 17:16)   письмо автору
 
 

Здравствуйте,

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

  Ответить  
 
 автор: mihdan   (17.04.2009 в 18:52)   письмо автору
 
   для: Stifter2   (17.04.2009 в 17:16)
 

а в чем собственно непонятки?

  Ответить  
 
 автор: Stifter2   (17.04.2009 в 20:04)   письмо автору
 
   для: mihdan   (17.04.2009 в 18:52)
 

Непонятки в том, как это реализовать.

  Ответить  
 
 автор: Trianon   (17.04.2009 в 20:14)   письмо автору
 
   для: Stifter2   (17.04.2009 в 20:04)
 

как обычно, если задача слишком сложна - разбить на несколько, попроще.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 00:25)   письмо автору
 
   для: Trianon   (17.04.2009 в 20:14)
 

Вот я и пытаюсь придумать это :) Вот и интересуюсь, как вообще люди это реализуют, чтобы не сильно сложно.

  Ответить  
 
 автор: Trianon   (18.04.2009 в 00:33)   письмо автору
 
   для: Stifter2   (18.04.2009 в 00:25)
 

>Вот я и пытаюсь придумать это :) Вот и интересуюсь, как вообще люди это реализуют, чтобы не сильно сложно.

Что интересуетесь - вижу.
Что пытаетесь придумать - нет.

Начать могли бы с более четкой и подробной постановки задачи.
Хорошо поставить задачу - значит наполовину её решить. Если не более.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 00:51)   письмо автору
 
   для: Trianon   (18.04.2009 в 00:33)
 

Пытаюсь :)
Хочу сделать следующее: есть записи в блоге, хочу на главной выводить облако тегов (хотя бы пока без привязки к частоте появлений, изменению размера, цвета ссылок в облаке и т. д.)

Можно сделать так как-нибудь: добавить поле в БД в таблице записи, например tag
В него при добавлении записи записывть одно слово (это и будет тег). То есть есть множество записей с тегами (по одному на запись). Теперь нужно как-то вывести их на главной (хотя бы пока что все какие есть, только без повторений).

 
<?
$query 
"SELECT tag FROM journal WHERE hide='show'";
$jm mysql_query($query);
if(
mysql_num_rows($jm) > 0) {
     while(
$entry mysql_fetch_array($jm)) {
          echo 
$entry[tag']."&nbsp;";
     }
}
?>


Ну примерно так, только вот как сделать
1. вывод без повторений.
2. чтобы нетолько 1 тег к записи в блоге добавлять (на крайний случай конечно еще несколько полей tag2 tag3 и т. д.)
3. дальше что будет проихсодить по переходу по тегу (ну это в принципе можно через запрос по полям tag сделать вывод)
4. как сделать изменение форматиования по частоте
и еще много пунктов в таком мной придуманном идиотском алгоритме. :)

Trianon, подскажите, пожалуйста, какой-нибудь алгоритм.

  Ответить  
 
 автор: Trianon   (18.04.2009 в 01:04)   письмо автору
 
   для: Stifter2   (18.04.2009 в 00:51)
 

>Ну примерно так, только вот как сделать
>1. вывод без повторений.
>2. чтобы нетолько 1 тег к записи в блоге добавлять (на крайний случай конечно еще несколько полей tag2 tag3 и т. д.)

число полей не должно зависеть от любых количественных характеристик модели.
Вам придется завести две дополнительные таблицы.
Одну - собственно с тегами.
Другую - таблицу связи, каждая строка которой будет показывать, что некоторая запись в блоге отмечена некоторым тегом. Так называемое отношение N:M
Никаких дополнительных полей в таблице записей блога не потребуется.

Проблема повторов решится сама собой.
Проблема расчета частоты - один-два примитивных запроса к таблице связей.

>и еще много пунктов в таком мной придуманном идиотском алгоритме. :)
У Вас же сейчас никакого алгоритма нет, кроме простейшего шаблона кода для прямого вывода информации из таблицы на страницу.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 01:12)   письмо автору
 
   для: Trianon   (18.04.2009 в 01:04)
 

Алгоритм в плане, то как я всё это хотел сделать.

Итак.
таблица1 tags

id_tag    name
1             страны
2             путешествия
3             интернет
4             php


таблица2 cloud

id_entry  id_tag
23           2
24           1
34           2
54           4


Примерно так? А как сделать, чтобы несколько тегов к одной записи?

  Ответить  
 
 автор: Trianon   (18.04.2009 в 01:22)   письмо автору
 
   для: Stifter2   (18.04.2009 в 01:12)
 

>Алгоритм в плане

ну-ну...


>
>Примерно так? А как сделать, чтобы несколько тегов к одной записи?

таблица2 cloud

id_entry  id_tag
23           2
54           3
24           1
34           2
54           4


Если б можно было делать лишь один тег - не пришлось бы создавать таблицу.
Достаточно было номер тега воткнуть бы в поле записи блога.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 01:28)   письмо автору
 
   для: Trianon   (18.04.2009 в 01:22)
 

Буду размышлять как теперь эти теги туда заносить :)

  Ответить  
 
 автор: Stifter2   (19.04.2009 в 03:24)   письмо автору
 
   для: Trianon   (18.04.2009 в 01:22)
 

Сделал облако тегов :) Включил голову.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 01:27)   письмо автору
 
   для: Trianon   (18.04.2009 в 01:04)
 

Вот нашёл класс для преобразования массива в теги меняющиеся по размеру:


<?   
class TagsCloud {   
private 
$tags;   
private 
$font_size_min 14;   
private 
$font_size_step 5;   
function 
__construct($tags) {   
shuffle($tags);   
$this->tags $tags;    
}   
private function 
get_tag_count($tag_name$tags) {   
$count 0;   
foreach (
$tags as $tag) {   
if (
$tag == $tag_name) {   
$count++;   
}   
}   
return 
$count;   
}   
private function 
tagscloud($tags) {   
$tags_list = array();   
foreach (
$tags as $tag) {   
$tags_list[$tag] = self::get_tag_count($tag$tags);   
}   
return 
$tags_list;         
}   
private function 
get_min_count($tags_list) {   
$min $tags_list[$this->tags[0]];   
foreach (
$tags_list as $tag_count) {   
if (
$tag_count $min$min $tag_count;   
}   
return 
$min;   
}   
public function 
get_cloud() {   
$cloud = Array();   
$tags_list self::tagscloud($this->tags);   
$min_count self::get_min_count($tags_list);   
foreach (
$tags_list as $tag=>$count) {   
$font_steps $count $min_count;   
$font_size $this->font_size_min $this->font_size_step $font_steps;   
$cloud[] = "<span style='font-size:".$font_size."px'>".$tag."</span>";   
}   
return 
$cloud;   
}   
}   

$tags = array(   
'ajax''javascript''php''dojo',   
'ajax''jquery''seo''seo',   
'php''blog''ajax''php',   
'html''css''ajax''javascript',   
'css''jquery''php''smo'  
);   
$mycloud   = new TagsCloud($tags);   
$tags_list $mycloud->get_cloud();   
foreach (
$tags_list as $tag) {   
echo 
$tag.' ';   
}   
  
?>  


В скрипте слова-теги уже вбиты в массиве. А как в этот массив вставить поля из таблицы через запрос?

  Ответить  
 
 автор: Лерк   (18.04.2009 в 02:31)   письмо автору
 
   для: Stifter2   (18.04.2009 в 01:27)
 

А как в этот массив вставить поля из таблицы через запрос?

Как и обычно. Вы уже в этой теме показывали, что знаете как можно сформировать простой sql-запрос для получения данных из таблицы.

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 11:36)   письмо автору
 
   для: Лерк   (18.04.2009 в 02:31)
 

Не получается вместо array() выдать мои слова из БД.
Подскажите, пожалуйста,

Вот код он выводит слова:

<?
$query 
"SELECT tag FROM journal WHERE hide='show'"
$jm mysql_query($query); 
if(
mysql_num_rows($jm) > 0) { 
     while(
$entry mysql_fetch_array($jm)) {
          echo 
$entry['tag']."&nbsp;"
     } 
}
?> 


А вот сюда мне бы его приспособить, чтобы вместо 'ajax', 'javascript', 'php', 'dojo'... вставлял слова из моего запроса.

<? 
$tags 
= array(   
'ajax''javascript''php''dojo',   
'ajax''jquery''seo''seo',   
'php''blog''ajax''php',   
'html''css''ajax''javascript',   
'css''jquery''php''smo'  
);   
$mycloud   = new TagsCloud($tags);   
$tags_list $mycloud->get_cloud();   
foreach (
$tags_list as $tag) {   
echo 
$tag.' ';   

?>   

  Ответить  
 
 автор: mihdan   (18.04.2009 в 15:10)   письмо автору
 
   для: Stifter2   (18.04.2009 в 11:36)
 

<?php
$query 
"SELECT tag FROM journal WHERE hide='show'"
$jm mysql_query($query); 
if(
mysql_num_rows($jm) > 0) { 
     while(
$entry mysql_fetch_array($jm)) {
          
$tags[] =  $entry['tag']; 
     } 
     
$mycloud   = new TagsCloud($tags);   
     
$tags_list $mycloud->get_cloud();   
     foreach (
$tags_list as $tag) {   
         echo 
$tag.' ';   
     }  
}
?> 

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 23:25)   письмо автору
 
   для: mihdan   (18.04.2009 в 15:10)
 

К сожалению, так не работает. Но всё равно спасибо.
Я придумал вот так:

<?
$tags 
= Array();
$query "SELECT tag FROM journal WHERE hide='show'"
$jm mysql_query($query); 
if(
mysql_num_rows($jm) > 0) { 
  while(
$entry mysql_fetch_array($jm)) { 
    if (!empty(
$entry['tag'])) {
      
$tags[] = $entry['tag'].' '
    }
  } 

$mycloud   = new TagsCloud($tags);   
$tags_list $mycloud->get_cloud();   
foreach (
$tags_list as $tag) {   
  echo 
$tag.'&nbsp;';   
}

?>


Работает :)

  Ответить  
 
 автор: Stifter2   (18.04.2009 в 11:41)   письмо автору
 
   для: Лерк   (18.04.2009 в 02:31)
 

Прошу помощи в объединении этих двух кодов.

  Ответить  
 
 автор: Unreal   (19.04.2009 в 12:09)   письмо автору
 
   для: Stifter2   (17.04.2009 в 17:16)
 

<?php
            
function getCloud$data = array(), $nums$minFontSize 12$maxFontSize 30)
            {
                
$minimumCount min(array_values($nums));
                
$maximumCount max(array_values($nums));
                
$spread       $maximumCount $minimumCount;
                
$cloudHTML    '';
                
$cloudTags    = array();
             
                
$spread == && $spread 1;
             
                foreach( 
$data as $tag => $arr_data )
                {
                    
$count $arr_data['num'];
                    
$id $arr_data['id'];
                    
$size $minFontSize + ( $count $minimumCount 
                        * ( 
$maxFontSize $minFontSize ) / $spread;
                    
$cloudTags[] = '<a style="font-size: ' floor$size ) . 'px' 
                                    
'" class="tag_cloud" href="/' $id 
                                    
'" title="\'' $tag  '\' опечаток ' $count '">' 
                                    
htmlspecialcharsstripslashes$tag ) ) . '</a>';
                }
             
                return 
join"\n"$cloudTags ) . "\n";
            }    

            if (isset(
$this->letters_data)) {
                foreach (
$this->letters_data as $key => $l_data) {
                    
$letter_nums[] = $l_data['letter_num'];
                    
$arr[$l_data['letter']] = array('num' => $l_data['letter_num'], 'id' => $l_data['rus_letter_id']);
                }
                echo 
'<h1 class="title">Наиболее популярные опечатки по буквам</h1>';
                print 
'<p class="letter_tag_cloud">' getCloud($arr$letter_nums) . '</p>';
            }
            
?>

  Ответить  
 
 автор: Stifter2   (19.04.2009 в 17:22)   письмо автору
 
   для: Unreal   (19.04.2009 в 12:09)
 

Всем спасибо, уже все сделал, работает отлично.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования