80 votes

Quelle est la meilleure façon de générer un nuage de tags à partir d'un tableau en utilisant h1 à h6 pour le dimensionnement?

J'ai les tableaux suivants:

 $artist = array("the roots", "michael jackson", "billy idol", "more", "and more", "and_YET_MORE");
$count = array(5, 3, 9, 1, 1, 3);
 

Je souhaite générer un nuage de tags qui contiendra des artistes avec un nombre plus élevé de $count inclus dans des tags h6 et les plus faibles tags inclus h1 .

43voto

berkes Points 9945

Vous voudrez également y ajouter une fonction logarithmique. (extrait de tagadelic, mon module Drupal pour créer des nuages de tags 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);
}
 

Ensuite, dans votre vue ou modèle:

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

34voto

Ryan Fox Points 5181

Du haut de ma tête...

 $artist = array("the roots","michael jackson","billy idol","more","and more","and_YET_MORE"); 

27voto

Brendan Points 7674

C’est peut-être un peu académique et ergonomique, mais les balises hX ne sont probablement pas le meilleur choix pour un nuage de balises pour des raisons de structure de document, etc.

Peut-être que Spans ou un ol avec les attributs de classe appropriés (plus quelques CSS)?

8voto

Kevin Points 6567

@Ryan

C'est exact, mais en fait, les balises avec le plus petit nombre sont plus grandes. Ce code a été testé:

 $artist = array("the roots","michael jackson","billy idol","more","and more","and_YET_MORE"); 

5voto

UnkwnTech Points 21942

Personnellement je ferais quelque chose comme ça:

 <?php
    $data = array($rating[0] => array('word0', 'word1', 'word2'), $rating[1] => array('word3', 'word4', 'word8',...));
    //assums that $rating is an array with the weight of each word so the more popular words would have a higher value in rating
    usort($data); //sort the $data variable, this should give us the most popular words first
    $size = '1';
    foreach($data as $rank)
    {
        $i=0;
        while($i<$count($rank))
        {
            echo "<h" . $size . ">" . $rank[$i] . "</h" . $size . ">";
            $i++;
        }

        $size++;
    }
?>
 

En supposant que je ne suis pas un idiot complet, cela devrait fonctionner. Mais ce n'est pas testé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X