What's the best way to generate a tag cloud from an array using h1 through h6 for sizing?
我有以下数组:
1 2
| $artist = array("the roots","michael jackson","billy idol","more","and more","and_YET_MORE");
$count = array(5, 3, 9, 1, 1, 3); |
我想生成一个标签云,其中在h6标签中包含的$count中编号较高的艺术家和在h1标签中包含的最低编号的艺术家。
您也将想要添加对数函数。 (摘自我的Drupal模块tagadelic,以创建标签云http://drupal.org/project/tagadelic):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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);
} |
然后在您的视图或模板中:
1 2 3
| foreach ($tags as $tag) {
$output .="<h$tag->weight>$tag->name</h$tag->weight>"
} |
从我头顶上...
1 2 3 4 5 6 7 8 9
| $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或ol具有适当的类属性(加上一些CSS)?
使用了此代码段已有一段时间,信誉是Prism-perfect.net。虽然不使用H标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| Popular Searches
<?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.' ';
// notice the space at the end of the link
}
?> |
@瑞安
没错,但实际上它会使数量最少的标签变大。此代码已经过测试:
1 2 3 4 5 6 7 8
| $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种尺寸:
1 2 3 4 5 6 7 8 9 10 11
| 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(最差):
1 2 3 4 5 6 7
| <?php foreach ($allTags as $tag): ?>
<span class="<?php echo 'tagrank'.$tag['ranking'] ?>">
<?php echo sprintf('%s',
$tag['slug'], $tag['tag']
); ?>
</span>
<?php endforeach; ?> |
这是CSS:
1 2 3 4 5
| /* put your size of choice */
.tagrank1{font-size: 0.3em;}
.tagrank2{font-size: 0.4em;}
.tagrank3{font-size: 0.5em;}
/* go on till tagrank10 */ |
此方法显示所有标签。如果有很多标签,您可能不希望标签云成为标签风暴。在这种情况下,您可以在SQL查询中附加HAVING TO子句:
1 2 3
| -- minimum tag count is 8 --
HAVING count(tag) > 7 |
就这样
作为Rails的帮助者:
1 2 3 4
| 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 |
从视图中调用此方法:
1
| <%= tag_cloud($artists, $counts) %> |
这将在数??组中输出元素,该元素将在视图中转换为字符串以最终呈现,如下所示:
1 2 3 4 5 6
| <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属性并在样式表中引用Brendan上面提到的类。与在语义上使用h1-h6相比要好得多,并且的样式负担更少。
我知道这是一个非常古老的帖子,但我仍在发表自己的观点,因为它可能会在将来对某人有所帮助。
这是我在网站上使用的tagcloud:
http://www.vbausefulcodes.in/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?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"";
$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"";
$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>";
}
?> |
|