php - qué - ¿Cuál es la mejor manera de generar una nube de etiquetas desde una matriz usando h1 a h6 para dimensionar?
qué son etiquetas h1 h2 h3 (8)
Tengo las siguientes matrices:
$artist = array("the roots", "michael jackson", "billy idol", "more", "and more", "and_YET_MORE");
$count = array(5, 3, 9, 1, 1, 3);
Quiero generar una nube de etiquetas que tendrá artistas con un número más alto en
$count
encerrado en etiquetas
h6
y las etiquetas
h1
encerradas más bajas.
@Ryan
Eso es correcto, pero en realidad hace que las etiquetas con el menor número, más grandes. Este código ha sido probado:
$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>";
}
Como ayudante en 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
Llame esto desde la vista:
<%= tag_cloud($artists, $counts) %>
Esto genera elementos de
<span style=''font-size:_em''>
en una matriz que se convertirá en una cadena en la vista para finalmente renderizar así:
<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>
Sería mejor tener un atributo de
class
y hacer referencia a las clases en una hoja de estilo como mencionó Brendan anteriormente.
Mucho mejor que usar semánticamente
h1-h6
y hay menos equipaje de estilo con un
<span>
.
Este método es para fanáticos de
SQL/PostgreSQL
.
Realiza todo el trabajo en la base de datos e imprime el texto con el enlace "slugified".
Utiliza Doctrine
ORM
solo para la llamada sql, no estoy usando objetos.
Supongamos que tenemos 10 tamaños:
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);
}
luego los imprime con alguna clase de CSS, desde .tagranking10 (el mejor) hasta .tagranking1 (el peor):
<?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; ?>
y este es el
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 */
Este método muestra todas las etiquetas.
Si tiene muchos de ellos, probablemente no quiera que su nube de etiquetas se convierta en una
tormenta de etiquetas
.
En ese caso, agregaría una cláusula
HAVING TO
a su consulta SQL:
-- minimum tag count is 8 --
HAVING count(tag) > 7
Eso es todo
He usado este fragmento por un tiempo, el crédito es prism-perfect.net. Sin embargo, no usa etiquetas 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>
La parte superior de mi cabeza...
$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.">";
}
Quizás esto sea un poco académico y fuera de tema, pero
hX
etiquetas
hX
probablemente no sean la mejor opción para una nube de etiquetas por razones de estructura de documentos y todo ese tipo de cosas.
¿Quizás
span
so un
ol
con atributos de clase apropiados (más algunos CSS)?
Sé que es una publicación muy antigua. publicar mi punto de vista ya que puede ayudar a alguien en el futuro.
Aquí está el tagcloud que utilicé en mi sitio web 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>";
}
?>
También querrás agregarle una función logarítmica. (tomado de tagadelic, mi módulo Drupal para crear nubes de etiquetas 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);
}
Luego, en su vista o plantilla:
foreach ($tags as $tag) {
$output .= "<h$tag->weight>$tag->name</h$tag->weight>"
}