Boyutlandırma için h6 ile h1 kullanarak bir diziden bir etiket bulutu oluşturmak için en iyi yolu nedir?

10 Cevap php

Ben şu diziler var:

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

I $count h6 etiketleri ve düşük kapalı h1 etiketleri içine daha yüksek bir sayı ile sanatçılar olacak bir etiket bulutu oluşturmak istiyorum.

10 Cevap

Sen de ona bir logaritmik fonksiyon eklemek isteyeceksiniz. (Tagadelic alınan benim Drupal modülü etiket bulutları oluşturmak için 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);
}

Sonra görünümünde veya şablonu:

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

Kafamın üst Off ...

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

Belki bu biraz akademik ve OT ama HX etiketler muhtemelen belge yapısı nedeniyle ve bir şey tüm bu tür için bir etiket bulutu için en iyi seçim değildir ...

Belki açıklıklı veya uygun sınıfı öznitelikleri (artı bazı css) ile bir ol?

@ Ryan

Bu doğru ama aslında az sayıda, daha büyük olan etiketleri yapar. Bu kod test edilmiştir:

$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>";
}

kevind yazdı:

@ Ryan

Bu doğru ama aslında az sayıda, daha büyük olan etiketleri yapar. Bu kod test edilmiştir:

Aslında yüksek sayı etiketleri yüksek frekansları belirtilen benim cevap-orijinal posteri bu söz geliyordu, ancak HTML daha önemli başlıklar için daha düşük numaralarını kullanır.

Ben spec benim kod yazdı. ; P

Bir süre için, bu pasajı kullanmış, kredi prizma-perfect.net olduğunu. H etiketleri olsa kullanmaz

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

Şahsen ben böyle bir şey yapardı:

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

Ben bu çalışması gerekir tam bir aptal değilim varsayarsak. Ama denenmemiş olduğunu.

I actually meant to mention this in my answer- the original poster specified higher frequencies in higher-number tags, but HTML uses lower numbers for more significant headings.

Ben spec benim kod yazdı. ; P

Ben şimdi bakın AH, bu yüksek küçük etiketini saymak bana karşı sezgisel görünüyordu?

Benim hatam.

This method is for SQL/PostgreSQL fanatics. It does the entire job in the database, and it prints text with "slugified" link. It uses Doctrine ORM just for the sql call, I'm not using objects. Suppose we have 10 sizes:

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

.. sonra tagranking1 (en kötü) için tagranking10 (iyi) den, bazı CSS sınıfı ile onları baskı:

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

ve bu 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 */

Bu yöntem, tüm etiketleri gösterir. Eğer onlardan bir sürü varsa, muhtemelen etiket bulutu bir tag storm olmak istemiyorum. Bu durumda SQL sorgusu için HAVING TO maddesini eklemesi:

-- minimum tag count is 8 --

HAVING count(tag) > 7

Hepsi bu

Rails bir yardımcı olarak:

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

Görünümden diyoruz:

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

Bu sonuçta şöyle işlemek için görünümde bir dizeye dönüştürülür olacak bir dizideki elemanları çıkışlar:

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

Bu bir 'sınıf' nitelik ve yukarıda Brendan tarafından belirtildiği gibi bir stil sayfasında derslere başvurmak için daha iyi olurdu. h1-h6 anlam ve <span> daha az tarzı bagaj var kullanarak daha iyi.