Aquí podría ser tu PUBLICIDAD


¿Cuál es la mejor manera de generar una nube de etiquetas desde una matriz usando h1 a h6 para dimensionar?

votos
67

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 $counten las h6etiquetas incluidas y las h1etiquetas incluidas más bajas .

Publicado el 01/08/2008 a las 22:40
fuente por usuario w-ll
En otros idiomas...        العربية       

8 respuestas

votos
38

Usted tendrá que añadir una función logarítmica a él también. (tomado de mi módulo de Drupal tagadelic 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>"
}
Respondida el 31/05/2010 a las 12:53
fuente por usuario berkes


Aquí podría ser tu PUBLICIDAD


votos
30

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.">";
}
Respondida el 02/08/2008 a las 12:10
fuente por usuario Ryan Fox

votos
22

Tal vez esto sea un poco académico y fuera de tema, pero las hXetiquetas probablemente no sean la mejor opción para una nube de etiquetas por razones de estructura de documentos y todo ese tipo de cosas.

Tal vez spans o una olcon los atributos de clase apropiados (más algunos CSS)?

Respondida el 03/08/2008 a las 02:01
fuente por usuario Brendan

votos
8

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

<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>
Respondida el 17/09/2008 a las 10:29
fuente por usuario essexboyracer

votos
6

@Ryan

Eso es correcto, pero en realidad hace 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>";
}
Respondida el 02/08/2008 a las 12:58
fuente por usuario Kevin

votos
2

Este método es para SQL/PostgreSQLfanáticos. Se hace todo el trabajo en la base de datos, e imprime texto con enlace "slugified". Utiliza Doctrina ORMpara 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 usted tiene un montón de ellos, es probable que no quiere que su nube de etiquetas para convertirse en una tormenta de la etiqueta . En ese caso, se agregaría una HAVING TOcláusula a su consulta SQL:

-- minimum tag count is 8 --

HAVING count(tag) > 7

Eso es todo

Respondida el 14/07/2010 a las 07:19
fuente por usuario danieli

votos
1

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

Llamar esto desde la vista:

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

Esto produce <span style='font-size:_em'>elementos 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 classatributo y hacer referencia a las clases en una hoja de estilos como lo menciona Brendan arriba. Mucho mejor que usar h1-h6semánticamente y hay menos equipaje de estilo con a <span>.

Respondida el 02/10/2008 a las 10:47
fuente por usuario Swards

votos
0

Sé que es muy antiguo puesto. publicar mi punto de vista, ya que puede ayudar a alguien en el futuro.

Aquí está 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>";
}
?>
Respondida el 28/01/2017 a las 01:39
fuente por usuario user3391693