Hva er den beste måten å generere en tag cloud fra en array ved hjelp h1 gjennom h6 for dimensjonering?

stemmer
69

Jeg har følgende matriser:

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

Jeg ønsker å generere en tag cloud som vil ha artister med et høyere antall i $countvedlagt i h6kodene og de laveste vedlagte h1koder.

Publisert på 01/08/2008 klokken 21:40
kilden bruker
På andre språk...                            


8 svar

stemmer
39

Du vil ønske å legge til en logaritmisk funksjon til det også. (hentet fra tagadelic, min Drupal modul for å lage tag clouds 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);
}

Så i ditt syn eller mal:

foreach ($tags as $tag) {
    $output .= "<h$tag->weight>$tag->name</h$tag->weight>"
}
Svarte 31/05/2010 kl. 11:53
kilden bruker

stemmer
30

Av toppen av hodet mitt ...

$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.">";
}
Svarte 01/08/2008 kl. 23:10
kilden bruker

stemmer
23

Kanskje dette er litt akademisk og off topic, men hXtaggene er sannsynligvis ikke det beste valget for en tag cloud av hensyn til dokumentstrukturen og alt sånt.

Kanskje spaner eller en olmed passende klasse attributter (pluss noen CSS)?

Svarte 03/08/2008 kl. 13:01
kilden bruker

stemmer
8

Har brukt dette tekstutdraget for en stund, er kreditt prism-perfect.net. Bruker ikke H-koder selv

<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>
Svarte 17/09/2008 kl. 21:29
kilden bruker

stemmer
7

@Ryan

Det er riktig, men det faktisk gjør kodene med minst antall, større. Denne koden er testet:

$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>";
}
Svarte 01/08/2008 kl. 23:58
kilden bruker

stemmer
2

Denne metoden bygger på SQL/PostgreSQLfanatikere. Det gjør hele jobben i databasen, og det skrives tekst med "slugified" linken. Den bruker Lære ORMbare for sql samtale, jeg ikke bruker gjenstander. Anta at vi har 10 størrelser:

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);
}

så du skrive dem ut med noen CSS-klasse, fra .tagranking10 (best) til .tagranking1 (verste):

<?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; ?>

og dette er 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 */

Denne metoden viser alle tagger. Hvis du har mange av dem, har du sannsynligvis ikke vil at tag cloud å bli en tag storm . I så fall vil du legge en HAVING TOklausul i din SQL-spørring:

-- minimum tag count is 8 --

HAVING count(tag) > 7

Det er alt

Svarte 14/07/2010 kl. 18:19
kilden bruker

stemmer
1

Som en hjelper i 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

Kaller dette fra visningen:

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

Denne utmater <span style='font-size:_em'>elementer i en matrise som vil bli konvertert til en streng i visningen til slutt gjengi slik:

<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> 

Det ville være bedre å ha en classattributt og referere klassene i et stilark som nevnt av Brendan ovenfor. Mye bedre enn å bruke h1-h6semantisk og det er mindre stil bagasje med <span>.

Svarte 02/10/2008 kl. 21:47
kilden bruker

stemmer
0

Jeg vet det er gammelt innlegg. poste mitt syn som det kan hjelpe noen i fremtiden.

Her er tagcloud jeg brukte i min nettside 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>";
}
?>
Svarte 28/01/2017 kl. 04:39
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more