среда, 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