Показаны сообщения с ярлыком теги. Показать все сообщения
Показаны сообщения с ярлыком теги. Показать все сообщения

среда, 16 июля 2008 г.

Скрипт генерации облака тегов или подсчет количества популярных слов.

Потребовалось создать Облако тегов, обшарив не большое количество блогов понял что скрипты пишут довольно странно, и большинство ссылается друг на друга не чего не объясняя, в общем облако сделал, на оформление увы =) руки не дошли, можете в гугле поискать там есть куча примеров и готовых CSS оформлении с сортировкой по размеру. Получилась такая интересная тема, просто взял открыл книжку: ПХП от програмиста програмисту и там все есть =). Профессиональное PHP программирование. или скачать, закачку принесу , если надо конечно.
Облако или текст с количеством слов получился нормально, ну и соответственно закешировали наше облачко. Так облако формируется в зависимости от количества повторений слов, будем считать повторения, и соответственно самое большое повторение должно быть больше размером.
короче:
$clo = new Clouds(); //Создаем Облака ) на самом деле просто клас где слова
//режутся и сортируются т.е выбираются популярные слова.

$cachetime = date('U'); // время для сверки

if (file_exists("cache/$cachename")&&($cachetime - filemtime("cache/".$cachename.""))<3600)>
актуальности кеша 3600 секунд - 1 час помоему =)

ob_start(); $content = include("cache/".$cachename.""); // если условие выполнилось то подключаем то что в файлике лежит

$content = ob_get_contents(); ob_end_clean(); } else {ob_start(); // иначе создаем файл кеша для слов

global $db;
$content = "";
$result = $db->sql_query("SELECT tags FROM `news` ORDER BY id DESC");
//у меня слова размещены в таблице с новостями, ORDER BY не влияет просто мне так нравиться
$cachecon ="";
while ($row = $db->sql_fetchrow($result)) { // $db - класс работы с базой данных
// если у вас работа не через класс, то либо его можно сделать из тойже самой книжки, либо mysql_fetch_array();

$cachecon .= $row['tags'].","; // вытащили нужные слова, соединили их в строку.
}
$megaclo = $clo->get_cloud($cachecon); // вытащили самые популярные слова
$content .="$megaclo";
$content .="";
echo $content; // выводим даные для захвата ob_start(), если не прав напишите а то временами тупняк нападает.

$content2 = ob_get_contents(); // почему я сначало вывожу переменную, а потом сбрасываю в другую? =) сам не понимаю, иначе просто не засовывается в кеш. =(

$fo = fopen("cache/$cachename", 'w+');
fwrite($fo,$content2); //запись в файл.
fclose($fo);
ob_end_clean();
}
class Clouds
{
var $origin_arr;
var $modif_arr;

function explode_str($text)
{
$search = array ("'ё'",
"' '",
"']*?>.*?'si", // Вырезается javascript
"'<[\/\!]*?[^<>]*?>'si", // Вырезаются html-тэги
"'([\r\n])[\s]+'", // Вырезается пустое пространство
"'&(quot|#34);'i", // Замещаются html-элементы
"'&(amp|#38);'i",
"'&(lt|#60);'i",

"'&(gt|#62);'i",
"'&(nbsp|#160);'i",

"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",

"'&#(\d+);'e");
$replace = array ("е",

" ",
" ",
" ",
"\\1 ",
"\" ",
" ",
" ",

" ",
" ",
chr(161),
chr(162),
chr(163),
chr(169),

"chr(\\1)");
$text = preg_replace ($search, $replace, $text);
$del_symbols = array(" ",".", "—", "«", "»", "–",
";", ":", "\"", "#", "\$", "%", "^",
"!", "@", "`", "~", "*", "-", "=", "+", "\\",
"|", "/", ">", "<", "(", ")", "&", "?", "?", "\t", "\r", "\n", "{","}","[","]", "'", "“", "”", "•", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); $text = str_replace($del_symbols,
array(" "), $text); $text = ereg_replace("( +)", " ", $text); $this->origin_arr = explode(",", trim($text));
return $this->origin_arr;
}

function countwords()

{
$mas = array();

foreach ($this->origin_arr as $val)
{
if (strlen($val)>=3) // минимальная длинна слова, а зачем короткие? у меня стоит 5, потому-что теги генерируются автоматически =)
{
$val = strtolower($val);
if (array_key_exists($val, $mas))

{
$mas[$val]++;

}
else
{
$mas[$val] = 1;
}
}
}

arsort ($mas);
$this->modif_arr = $mas;
}
function get_cloud($text)
{
$this->explode_str($text);
$this->countwords();

$arr = array_slice($this->modif_arr, 0, 30);
$str = "";
foreach ($arr as $key=>$val)
{
$str .= " ". $key . "(".$val."),

"; // формируем строчку для вывод, конечно менятся от пожеланий...
}
return trim(substr($str, 0, strlen($str)-5)); // получам строку обрезанную на 5 символов, из-за ",
" на конце.
}
}
Да кстате в function get_cloud($text) поменяв $str .= " ". $key . "(".$val."),";
на
$str .= " ". $key ." (".$val."),";

- выведит в виде:
ну а как привязать CSS написано много....

Тык Тык UpToLike