boyutlandırma için h6 aracılığıyla h1 kullanarak bir diziden bir etiket bulutu oluşturmak için en iyi yolu nedir?

oy
67

Aşağıdaki diziler var:

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

Ben daha yüksek bir sayı ile sanatçılar olacak bir etiket bulutu oluşturmak istiyorum $countiçine h6etiketleri ve düşük kapalı h1etiketleri.

Oluştur 01/08/2008 saat 22:40
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
38

Sen de buna bir logaritmik fonksiyonu eklemek isteyecektir. (etiket bulutları oluşturmak için tagadelic, Drupal modülünden alınan 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 şablonda:

foreach ($tags as $tag) {
    $output .= "<h$tag->weight>$tag->name</h$tag->weight>"
}
Cevap 31/05/2010 saat 12:53
kaynak kullanıcı

oy
30

Başımın üstünde 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.">";
}
Cevap 02/08/2008 saat 00:10
kaynak kullanıcı

oy
22

Belki bu biraz akademik ve konu dışı ama hXetiketler muhtemelen belge yapısının nedenleri ve şey bütün bu tür bir etiket bulutu için en iyi seçenek değildir.

Belki spanbir s veya oluygun sınıf özelliklerine (artı bazı CSS) ile?

Cevap 03/08/2008 saat 14:01
kaynak kullanıcı

oy
8

Bir süre bu pasajı kullandınız mı, kredi prism-perfect.net olduğunu. gerçi H etiketlerini 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>
Cevap 17/09/2008 saat 22:29
kaynak kullanıcı

oy
6

@Ryan

Bu doğru ama aslında az sayıda daha büyük olan etiketler 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>";
}
Cevap 02/08/2008 saat 00:58
kaynak kullanıcı

oy
2

Bu yöntem için SQL/PostgreSQLfanatics. Bu veritabanında tüm işi yapar ve bu "slugified" bağlantıyı içeren metni yazdırır. Bu Doctrine kullanan ORMben nesneleri kullanarak değilim, sadece sql arama için. Biz 10 boyutları olduğunu varsayalım:

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

o zaman (en iyi) (en kötü) .tagranking1 için .tagranking10 gelen bazı CSS sınıfı ile yazdırabilirsiniz:

<?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örüntüler. Eğer onlardan bir sürü varsa, muhtemelen etiket bulutu bir olmak istemiyoruz etiket fırtına . Bu durumda bir ekleriz HAVING TOSQL sorgusu maddesini:

-- minimum tag count is 8 --

HAVING count(tag) > 7

Bu kadar

Cevap 14/07/2010 saat 19:19
kaynak kullanıcı

oy
1

Rails bir yardımcı gibi:

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 bu çağrı:

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

Bu çıktılar <span style='font-size:_em'>sonuçta çok benzeri için görünümünde bir dizeye dönüştürülür bir dizi elemanları:

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

Olması daha iyi olur classözelliğini ve yukarıda Brendan tarafından belirtildiği gibi bir biçembendindeki sınıfları referans. Çok kullanmaktan daha iyi h1-h6semantik ve daha az tarzı bagaj bir ile var <span>.

Cevap 02/10/2008 saat 22:47
kaynak kullanıcı

oy
0

Ben onun çok eski yazı biliyoruz. Benim görünümü gönderme gelecekte birine yardım olabilir.

İşte Web sitemde kullanılan Etiket Sistemi olduğunu 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>";
}
?>
Cevap 28/01/2017 saat 04:39
kaynak kullanıcı

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