|
|
|
| Здравствуйте,
не подскажите, как реализовать эту функцию. Алгоритм создания облака тегов с использованием БД сайта. | |
|
|
|
|
|
|
|
для: Stifter2
(17.04.2009 в 17:16)
| | а в чем собственно непонятки? | |
|
|
|
|
|
|
|
для: mihdan
(17.04.2009 в 18:52)
| | Непонятки в том, как это реализовать. | |
|
|
|
|
|
|
|
для: Stifter2
(17.04.2009 в 20:04)
| | как обычно, если задача слишком сложна - разбить на несколько, попроще. | |
|
|
|
|
|
|
|
для: Trianon
(17.04.2009 в 20:14)
| | Вот я и пытаюсь придумать это :) Вот и интересуюсь, как вообще люди это реализуют, чтобы не сильно сложно. | |
|
|
|
|
|
|
|
для: Stifter2
(18.04.2009 в 00:25)
| | >Вот я и пытаюсь придумать это :) Вот и интересуюсь, как вообще люди это реализуют, чтобы не сильно сложно.
Что интересуетесь - вижу.
Что пытаетесь придумать - нет.
Начать могли бы с более четкой и подробной постановки задачи.
Хорошо поставить задачу - значит наполовину её решить. Если не более. | |
|
|
|
|
|
|
|
для: 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']." ";
}
}
?>
|
Ну примерно так, только вот как сделать
1. вывод без повторений.
2. чтобы нетолько 1 тег к записи в блоге добавлять (на крайний случай конечно еще несколько полей tag2 tag3 и т. д.)
3. дальше что будет проихсодить по переходу по тегу (ну это в принципе можно через запрос по полям tag сделать вывод)
4. как сделать изменение форматиования по частоте
и еще много пунктов в таком мной придуманном идиотском алгоритме. :)
Trianon, подскажите, пожалуйста, какой-нибудь алгоритм. | |
|
|
|
|
|
|
|
для: Stifter2
(18.04.2009 в 00:51)
| | >Ну примерно так, только вот как сделать
>1. вывод без повторений.
>2. чтобы нетолько 1 тег к записи в блоге добавлять (на крайний случай конечно еще несколько полей tag2 tag3 и т. д.)
число полей не должно зависеть от любых количественных характеристик модели.
Вам придется завести две дополнительные таблицы.
Одну - собственно с тегами.
Другую - таблицу связи, каждая строка которой будет показывать, что некоторая запись в блоге отмечена некоторым тегом. Так называемое отношение N:M
Никаких дополнительных полей в таблице записей блога не потребуется.
Проблема повторов решится сама собой.
Проблема расчета частоты - один-два примитивных запроса к таблице связей.
>и еще много пунктов в таком мной придуманном идиотском алгоритме. :)
У Вас же сейчас никакого алгоритма нет, кроме простейшего шаблона кода для прямого вывода информации из таблицы на страницу. | |
|
|
|
|
|
|
|
для: 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
|
Примерно так? А как сделать, чтобы несколько тегов к одной записи? | |
|
|
|
|
|
|
|
для: Stifter2
(18.04.2009 в 01:12)
| | >Алгоритм в плане
ну-ну...
>
>Примерно так? А как сделать, чтобы несколько тегов к одной записи?
таблица2 cloud
id_entry id_tag
23 2
54 3
24 1
34 2
54 4
|
Если б можно было делать лишь один тег - не пришлось бы создавать таблицу.
Достаточно было номер тега воткнуть бы в поле записи блога. | |
|
|
|
|
|
|
|
для: Trianon
(18.04.2009 в 01:22)
| | Буду размышлять как теперь эти теги туда заносить :) | |
|
|
|
|
|
|
|
для: Trianon
(18.04.2009 в 01:22)
| | Сделал облако тегов :) Включил голову. | |
|
|
|
|
|
|
|
для: 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.' ';
}
?>
|
В скрипте слова-теги уже вбиты в массиве. А как в этот массив вставить поля из таблицы через запрос? | |
|
|
|
|
|
|
|
для: Stifter2
(18.04.2009 в 01:27)
| | А как в этот массив вставить поля из таблицы через запрос?
Как и обычно. Вы уже в этой теме показывали, что знаете как можно сформировать простой sql-запрос для получения данных из таблицы. | |
|
|
|
|
|
|
|
для: Лерк
(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']." ";
}
}
?>
|
А вот сюда мне бы его приспособить, чтобы вместо '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.' ';
}
?>
|
| |
|
|
|
|
|
|
|
для: 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.' ';
}
}
?>
|
| |
|
|
|
|
|
|
|
для: 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.' ';
}
?>
|
Работает :) | |
|
|
|
|
|
|
|
для: Лерк
(18.04.2009 в 02:31)
| | Прошу помощи в объединении этих двух кодов. | |
|
|
|
|
|
|
|
для: 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 == 0 && $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 . '">'
. htmlspecialchars( stripslashes( $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>';
}
?>
|
| |
|
|
|
|
|
|
|
для: Unreal
(19.04.2009 в 12:09)
| | Всем спасибо, уже все сделал, работает отлично. | |
|
|
|