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

Форум PHP

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

 

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

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

тема: Облако тегов
 
 автор: maximum7   (02.08.2009 в 17:09)   письмо автору
 
 

Добрый день.
Делаю облако тегов. Есть следующая таблица:

 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
        )

)


То есть у первого элемента нет класса... Как исправить?

  Ответить  
 
 автор: Trianon   (02.08.2009 в 17:23)   письмо автору
 
   для: maximum7   (02.08.2009 в 17:09)
 

дамп таблицы как выглядит?

  Ответить  
 
 автор: maximum7   (02.08.2009 в 17:25)   письмо автору
 
   для: Trianon   (02.08.2009 в 17:23)
 

Я же дал структуту. Три поля: Id слова, само слово и количество упоминаний

  Ответить  
 
 автор: Trianon   (02.08.2009 в 17:28)   письмо автору
 
   для: maximum7   (02.08.2009 в 17:25)
 

там же нет class среди полей?
При первом исполнении внешнего цикла, $terms пуст.
соответственно внутренний цикл выполнен не будет и никакой class в row не попадет.

Зачем гонять цикл в цикле - отдельный вопрос.

Я вообще не понимаю, зачем весь этот кошмар с циклами.

Даже больше. Я не понимаю такой методики расчета классов.

Представьте себе, что у Вас в таблице пять тегов, и у каждого счетчик равен 1.
Их что - все огромными буквами рисовать?

  Ответить  
 
 автор: maximum7   (02.08.2009 в 17:30)   письмо автору
 
   для: Trianon   (02.08.2009 в 17:28)
 

В цикле перебираются элементы таблицы, выбираются самые популярные слова. Потом к ним нужно добавить класс. Как сделать по другому?

  Ответить  
 
 автор: Trianon   (02.08.2009 в 17:34)   письмо автору
 
   для: maximum7   (02.08.2009 в 17:30)
 

>В цикле перебираются элементы таблицы, выбираются самые популярные слова.

Это делается отдельным запросом.
Либо предварительным циклом по результату запроса.
Но не циклом в цикле.

>Потом к ним нужно добавить класс. Как сделать по другому?

применительно к предложенному мной примеру - какой класс нужно поставить?

  Ответить  
 
 автор: maximum7   (02.08.2009 в 17:37)   письмо автору
 
   для: Trianon   (02.08.2009 в 17:34)
 

Необходимо поставить класс в зависимости от количества упоминаний, например large при $percent>= 60 and $percent <80, а дальше он будет подставляться при выводе в браузер: <span class={class}>

  Ответить  
 
 автор: Trianon   (02.08.2009 в 17:42)   письмо автору
 
   для: maximum7   (02.08.2009 в 17:37)
 

Еще раз.
Представьте себе, что у Вас в таблице пять тегов, и у каждого счетчик равен 1.
Какой должен быть поставлен класс на каждый тег?

  Ответить  
 
 автор: maximum7   (02.08.2009 в 17:45)   письмо автору
 
   для: Trianon   (02.08.2009 в 17:42)
 

class = smallest

  Ответить  
 
 автор: Trianon   (02.08.2009 в 17:46)   письмо автору
 
   для: maximum7   (02.08.2009 в 17:45)
 

почему?
Ведь percent равен 100%?

  Ответить  
 
 автор: maximum7   (02.08.2009 в 17:50)   письмо автору
 
   для: Trianon   (02.08.2009 в 17:46)
 

правильно, largest

  Ответить  
 
 автор: Trianon   (02.08.2009 в 18:01)   письмо автору
 
   для: 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>');

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

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