2008-08-01 7 views
65

У меня есть следующие массивы:Каков наилучший способ создания облака тегов из массива с использованием h1-h6 для определения размера?

$artist = array("the roots", "michael jackson", "billy idol", "more", "and more", "and_YET_MORE"); 
$count = array(5, 3, 9, 1, 1, 3); 

Я хочу, чтобы создать облако тегов, которые будут иметь художник с большим числом в $count, заключенном в h6 тегах и низкий закрытые h1 тегами.

ответ

38

Вы также захотите добавить к нему логарифмическую функцию. (Взято из tagadelic, мой модуль Drupal для создания облака тегов http://drupal.org/project/tagadelic):

db_query('SELECT COUNT(*) AS count, id, name FROM ... ORDER BY count DESC'); 

$steps = 6; 
$tags = array(); 
$min = 1e9; 
$max = -1e9; 

while ($tag = db_fetch_object($result)) { 
    $tag->number_of_posts = $tag->count; #sets the amount of items a certain tag has attached to it 
    $tag->count = log($tag->count); 
    $min = min($min, $tag->count); 
    $max = max($max, $tag->count); 
    $tags[$tag->tid] = $tag; 
} 
// Note: we need to ensure the range is slightly too large to make sure even 
// the largest element is rounded down. 
$range = max(.01, $max - $min) * 1.0001; 

foreach ($tags as $key => $value) { 
    $tags[$key]->weight = 1 + floor($steps * ($value->count - $min)/$range); 
} 

Затем в представлении или шаблона:

foreach ($tags as $tag) { 
    $output .= "<h$tag->weight>$tag->name</h$tag->weight>" 
} 
29

Off верхней части моей головы ...

$artist = array("the roots","michael jackson","billy idol","more","and more","and_YET_MORE"); 
$count = array(5,3,9,1,1,3); 
$highest = max($count); 
for (int $x = 0; x < count($artist); $x++) 
{ 
    $normalized = $count[$x]/$highest; 
    $heading = ceil($normalized * 6); // 6 heading types 
    echo "<h".$heading.">".$artist[$x]."</h".$heading.">"; 
} 
6

@Ryan

Это правильно, но это на самом деле делает метки с наименьшим числом, больше. Этот код был проверен:

$artist = array("the roots","michael jackson","billy idol","more","and more","and_YET_MORE"); 
$count = array(5,3,9,1,1,3); 
$highest = max($count); 
for ($x = 0; $x < count($artist); $x++) { 
    $normalized = ($highest - $count[$x]+1)/$highest; 
    $heading = ceil($normalized * 6); // 6 heading types 
    echo "<h$heading>{$artist[$x]}</h$heading>"; 
} 
22

Возможно, это немного академических и не по теме, но hX теги, вероятно, не лучший выбор для облака тегов по причинам структуры документа и все такого рода вещи.

Возможно, span s или ol с соответствующими атрибутами класса (плюс некоторые CSS)?

8

Используйте этот сниппет какое-то время, кредит - prism-perfect.net. Не используйте H теги, хотя

<div id="tags"> 
    <div class="title">Popular Searches</div> 
    <?php 
     // Snippet taken from [prism-perfect.net] 

     include "/path/to/public_html/search/settings/database.php"; 
     include "/path/to/public_html/search/settings/conf.php"; 

     $query = "SELECT query AS tag, COUNT(*) AS quantity 
     FROM sphider_query_log 
     WHERE results > 0 
     GROUP BY query 
     ORDER BY query ASC 
     LIMIT 10"; 

     $result = mysql_query($query) or die(mysql_error()); 

     while ($row = mysql_fetch_array($result)) { 

      $tags[$row['tag']] = $row['quantity']; 
     } 

     // change these font sizes if you will 
     $max_size = 30; // max font size in % 
     $min_size = 11; // min font size in % 

     // get the largest and smallest array values 
     $max_qty = max(array_values($tags)); 
     $min_qty = min(array_values($tags)); 

     // find the range of values 
     $spread = $max_qty - $min_qty; 
     if (0 == $spread) { // we don't want to divide by zero 
      $spread = 1; 
     } 

     // determine the font-size increment 
     // this is the increase per tag quantity (times used) 
     $step = ($max_size - $min_size)/($spread); 

     // loop through our tag array 
     foreach ($tags as $key => $value) { 

      // calculate CSS font-size 
      // find the $value in excess of $min_qty 
      // multiply by the font-size increment ($size) 
      // and add the $min_size set above 
      $size = $min_size + (($value - $min_qty) * $step); 
      // uncomment if you want sizes in whole %: 
      // $size = ceil($size); 

      // you'll need to put the link destination in place of the /search/search.php... 
      // (assuming your tag links to some sort of details page) 
      echo '<a href="/search/search.php?query='.$key.'&search=1" style="font-size: '.$size.'px"'; 
      // perhaps adjust this title attribute for the things that are tagged 
      echo ' title="'.$value.' things tagged with '.$key.'"'; 
      echo '>'.$key.'</a> '; 
      // notice the space at the end of the link 
     } 
    ?> 
</div> 
+0

Это, кажется, хороший подход ко мне. Если ваши данные находятся в массиве, просто пропустите часть базы данных. Я бы рекомендовал вам сохранить имя и счет исполнителя в одном ассоциативном массиве. Чтобы сделать эту работу с приведенным выше кодом, используйте что-то вроде: $ tags = array ("the roots" => 5, "michael jackson" = 3, "billy idol" => 9, "madonna" => 1); Я бы согласился не использовать теги H, поскольку это испортило вашу семантику. Пробелы были бы моим выбором. Наконец, в Zend Framework существует помощник, который может просто делать то, что вам нужно. См. Http://framework.zend.com/manual/en/zend.tag.html – simonrjones 2009-08-06 08:42:20

+0

Извините, без форматирования в приведенном выше комментарии кажется! – simonrjones 2009-08-06 08:42:54

1

Как помощник в Rails:

def tag_cloud (strings, counts) 
    max = counts.max 
    strings.map { |a| "<span style='font-size:#{((counts[strings.index(a)] * 4.0)/max).ceil}em'>#{a}</span> " } 
end 

Вызов этого с точки зрения:

<%= tag_cloud($artists, $counts) %> 

Это выводит <span style='font-size:_em'> элементы в массиве, который будет преобразуется в строку в виде, чтобы в конечном итоге сделать так:

<span style='font-size:3em'>the roots</span> 
<span style='font-size:2em'>michael jackson</span> 
<span style='font-size:4em'>billy idol</span> 
<span style='font-size:1em'>more</span> 
<span style='font-size:1em'>and more</span> 
<span style='font-size:2em'>and_YET_MORE</span> 

Лучше иметь атрибут class и ссылаться на классы в таблице стилей, как упомянуто выше Бренданом. Гораздо лучше, чем использование h1-h6 семантически, и есть меньше багажа стиля с <span>.

2

Этот метод предназначен для SQL/PostgreSQL фанатиков. Он выполняет всю работу в базе данных и печатает текст с помощью «slugified» ссылки. Он использует Doctrine ORM только для вызова sql, я не использую объекты. Предположим, мы имеем 10 размеры:

public function getAllForTagCloud($fontSizes = 10) 
{ 
    $sql = sprintf("SELECT count(tag) as tagcount,tag,slug, 
    floor((count(*) * %d)/(select max(t) from 
     (select count(tag) as t from magazine_tag group by tag) t)::numeric(6,2)) 
     as ranking 
     from magazine_tag mt group by tag,slug", $fontSizes); 

    $q = Doctrine_Manager::getInstance()->getCurrentConnection(); 
    return $q->execute($sql); 
} 

тогда напечатать их с некоторыми CSS класса, от .tagranking10 (в лучшем случае) до.tagranking1 (худший):

<?php foreach ($allTags as $tag): ?> 
    <span class="<?php echo 'tagrank'.$tag['ranking'] ?>"> 
     <?php echo sprintf('<a rel="tag" href="/search/by/tag/%s">%s</a>', 
      $tag['slug'], $tag['tag'] 
     ); ?> 
    </span> 
<?php endforeach; ?> 

и это CSS:

/* put your size of choice */ 
.tagrank1{font-size: 0.3em;} 
.tagrank2{font-size: 0.4em;} 
.tagrank3{font-size: 0.5em;} 
/* go on till tagrank10 */ 

Этот метод отображает все теги. Если у вас их много, вы, вероятно, не хотите, чтобы облако тегов стало тегом storm. В этом случае вы бы добавить к HAVING TO пункт для вашего запроса:

-- minimum tag count is 8 -- 

HAVING count(tag) > 7 

Это все

0

Я знаю его очень старый пост. отправляя мое мнение, поскольку это может помочь кому-то в будущем.

Вот TagCloud я использовал в моем веб-сайте http://www.vbausefulcodes.in/

<?php 
$input= array("vba","macros","excel","outlook","powerpoint","access","database","interview questions","sendkeys","word","excel projects","visual basic projects","excel vba","macro","excel visual basic","tutorial","programming","learn macros","vba examples"); 

$rand_tags = array_rand($input, 5); 
for ($x = 0; $x <= 4; $x++) { 
    $size = rand (1 , 4); 
    echo "<font size='$size'>" . $input[$rand_tags[$x]] . " " . "</font>"; 
} 

echo "<br>"; 
$rand_tags = array_rand($input, 7); 
for ($x = 0; $x <= 6; $x++) { 
    $size = rand (1 , 4); 
    echo "<font size='$size'>" . $input[$rand_tags[$x]] . " " . "</font>"; 
} 

echo "<br>"; 
$rand_tags = array_rand($input, 5); 
for ($x = 0; $x <= 4; $x++) { 
    $size = rand (1 , 4); 
    echo "<font size='$size'>" . $input[$rand_tags[$x]] . " " . "</font>"; 
} 
?>