2008-08-01 11 views

Respuesta

38

También querrá agregarle una función logarítmica. (Tomado de tagadelic, mi módulo de 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); 
} 

A continuación, en su opinión o plantilla:

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

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

@Ryan

Eso es correcto, pero lo que realmente hace que las etiquetas con el menor número, más grande. 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>"; 
} 
22

Tal vez esto es un poco etiquetas académicas y fuera de tema, pero hX probablemente no son la mejor opción para una nube de etiquetas por razones de estructura del documento y todo ese tipo de cosas.

Tal vez span s o ol con atributos de clase apropiados (más algunos CSS)?

8

He usado este fragmento por un tiempo, el crédito es prism-perfect.net. No usa etiquetas H embargo

<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

Esto parece un buen enfoque para mí. Si sus datos están en una matriz, omita la parte de la base de datos. Recomiendo que almacene el nombre del artista y cuente en una única matriz asociativa. Para que funcione con el código anterior, utilice algo como: $ tags = array ("the roots" => 5, "michael jackson" = 3, "billy idol" => 9, "madonna" => 1); Estoy de acuerdo en no usar etiquetas H ya que daña tu semántica. Los tramos serían mi elección. Finalmente, existe un asistente en Zend Framework que puede hacer exactamente lo que necesita. Ver http://framework.zend.com/manual/en/zend.tag.html – simonrjones

+0

lo siento, no parece que haya formato en el comentario anterior. – simonrjones

1

Como ayudante en rieles:

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 

Call esto desde el punto de vista:

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

Esto da salida a <span style='font-size:_em'> elementos de una matriz que será convertida a 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 class y hacer referencia a las clases en una hoja de estilos como lo menciona Brendan anteriormente. Mucho mejor que usar h1-h6 semánticamente y hay menos equipaje de estilo con un <span>.

+0

¿por qué alguien le dio un -1? – berkes

2

Este método es para los fanáticos SQL/PostgreSQL. Realiza todo el trabajo en la base de datos e imprime 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 imprimirlas con alguna clase CSS, desde .tagranking10 (la mejor) a.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 desee que su nube de etiquetas se convierta en tag storm. En ese caso, se agregaría una cláusula HAVING TO a la consulta SQL:

-- minimum tag count is 8 -- 

HAVING count(tag) > 7 

Eso es todo

0

Sé que es muy antiguo puesto. publicando mi opinión, ya que puede ayudar a alguien en el futuro.

Aquí es el tagcloud que utilicé en mi página 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>"; 
} 
?> 
Cuestiones relacionadas