|
|
|
| Добрый день.
Делаю облако тегов. Есть следующая таблица:
Id mediumint(5) unsigned NOT NULL auto_increment,
tag varchar(255) NOT NULL default '',
counter varchar(255) NOT NULL default
|
, где tag - ключевое слово, counter - количество упоминаний в тексте.
Делаю следующий запрос для выборки:
$terms = array(); // создали массив
$maximum = 0; // переменная для рассчёта максимального значения
$sql = $GLOBALS['db']->Query("SELECT * FROM modul_tagcloud");
while ($row = $sql->fetchrow())
{
$tag = $row->tag;
$counter = $row->counter;
if ($counter> $maximum) $maximum = $counter; // обновляем максимум. В таблице не должно быть нулей.
//$terms[] = array('tag' => $tag, 'counter' => $counter, 'class' => ''); // добавляем в массив
foreach ($terms as $k) // бежим по тегам в массиве
{
$percent = floor(($row->counter / $maximum) * 100); // рассчёт популярности тега в процентах
// определяем класс для тега из его популярности
if ($percent < 20)
{
$row->class = 'smallest';
} elseif ($percent>= 20 && $percent <40) {
$row->class = 'small';
} elseif ($percent>= 40 && $percent <60) {
$row->class = 'medium';
} elseif ($percent>= 60 && $percent <80) {
$row->class = 'large';
} else {
$row->class = 'largest';
}
}
array_push($terms,$row);
}
shuffle($terms); // перемешиваем массив, если нужно.
print_r('<hr><pre>');
print_r($terms);
print_r('</pre>');
|
Проблема в том, что в результате:
Array
(
[0] => stdClass Object
(
[Id] => 2
[tag] => слово2
[counter] => 500
)
[1] => stdClass Object
(
[Id] => 5
[tag] => слово1
[counter] => 60
[class] => smallest
)
)
|
То есть у первого элемента нет класса... Как исправить? | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:09)
| | дамп таблицы как выглядит? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 17:23)
| | Я же дал структуту. Три поля: Id слова, само слово и количество упоминаний | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:25)
| | там же нет class среди полей?
При первом исполнении внешнего цикла, $terms пуст.
соответственно внутренний цикл выполнен не будет и никакой class в row не попадет.
Зачем гонять цикл в цикле - отдельный вопрос.
Я вообще не понимаю, зачем весь этот кошмар с циклами.
Даже больше. Я не понимаю такой методики расчета классов.
Представьте себе, что у Вас в таблице пять тегов, и у каждого счетчик равен 1.
Их что - все огромными буквами рисовать? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 17:28)
| | В цикле перебираются элементы таблицы, выбираются самые популярные слова. Потом к ним нужно добавить класс. Как сделать по другому? | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:30)
| | >В цикле перебираются элементы таблицы, выбираются самые популярные слова.
Это делается отдельным запросом.
Либо предварительным циклом по результату запроса.
Но не циклом в цикле.
>Потом к ним нужно добавить класс. Как сделать по другому?
применительно к предложенному мной примеру - какой класс нужно поставить? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 17:34)
| | Необходимо поставить класс в зависимости от количества упоминаний, например large при $percent>= 60 and $percent <80, а дальше он будет подставляться при выводе в браузер: <span class={class}> | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:37)
| | Еще раз.
Представьте себе, что у Вас в таблице пять тегов, и у каждого счетчик равен 1.
Какой должен быть поставлен класс на каждый тег? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 17:42)
| | class = smallest | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:45)
| | почему?
Ведь percent равен 100%? | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2009 в 17:46)
| | правильно, largest | |
|
|
|
|
|
|
|
для: maximum7
(02.08.2009 в 17:50)
| | и типа ничего? По глазам бить не будет?
$sql = $GLOBALS['db']->Query("SELECT MAX(counter) AS mc FROM modul_tagcloud");
$row = $sql->fetchrow();
$max = $row->mc;
static $classes = array('smallest', 'small', 'medium','large','largest');
$sql = $GLOBALS['db']->Query("SELECT * FROM modul_tagcloud");
while ($row = $sql->fetchrow())
{
$row->class = $classes[intval(($row->counter-1)*5/$max)];
$terms[] = $row;
}
print_r('<hr><pre>');
print_r($terms);
print_r('</pre>');
|
| |
|
|
|