Intereting Posts
PHP, передать параметры из командной строки в скрипт PHP Символы Capistrano, кэшированные? Opencart 2.1.0.2 Ошибка при установке ocmod.zip Рекомендации по безопасному удалению (PHP / MySQL) Аргументы Escape для операторов PDO? Периодические проблемы платежного периода Как я могу автоматически настроить ширину изображения, созданного GD, в соответствии с текстом? Как программно проверить, повреждено ли изображение (PNG, JPEG или GIF)? получить категории, которые имеют подкатегории, используя laravel Радиоустройства Yii Как получить данные из Paypal, чтобы я мог соответствующим образом изменить свою базу данных MySQL? Прокрутка клавиши автозаполнения Обновление движка приложения разбивает CloudStorage в dev php env Как вы отслеживаете файлы в SMB с помощью приложения? Создание тега по умолчанию из пустого значения генерируется, когда тег отсутствует. Как разрешить?

Каков наилучший способ создания облака тегов из массива с использованием 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 .

Вы также захотите добавить к нему логарифмическую функцию. (взято из 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>" } 

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

 $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.">"; } 

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

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

Использовали этот фрагмент на некоторое время, кредит – 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> 

@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>"; } 

Этот метод предназначен для фанатиков 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 */ 

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

 -- minimum tag count is 8 -- HAVING count(tag) > 7 

Это все

Как помощник в 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> .

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

Вот 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>"; } ?>