Как лучше всего сгенерировать облако тегов из массива с использованием h1 - h6 для определения размера?

У меня есть следующие массивы:

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

Я хочу создать облако тегов, в котором исполнители с большим числом в $count будут заключены в теги h6, а теги h1 будут заключены с наименьшим числом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
75
0
8 139
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

С верхней части моей головы...

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

@ Райан

Это правильно, но на самом деле теги с наименьшим номером становятся больше. Этот код был протестирован:

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

Возможно, это немного академично и не по теме, но теги hX, вероятно, не лучший выбор для облака тегов из-за структуры документа и тому подобного.

Может быть, spans или ol с соответствующими атрибутами класса (плюс немного CSS)?

Некоторое время использовал этот фрагмент, кредит prism-perfect.net. Однако не использует H-теги

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

Мне это кажется хорошим подходом. Если ваши данные находятся в массиве, просто пропустите часть базы данных. Я бы рекомендовал вам хранить имя исполнителя и количество в едином ассоциативном массиве. Чтобы заставить это работать с приведенным выше кодом, используйте что-то вроде: $ tags = array ("the корни" => 5, "michael jackson" = 3, "billy idol" => 9, "madonna" => 1); Я бы согласен, не используйте H-теги, так как это испортит вашу семантику. Пролеты были бы моим выбором. Наконец, в Zend Framework есть помощник, который может делать то, что вам нужно. См. framework.zend.com/manual/en/zend.tag.html

simonrjones 06.08.2009 12:42

В качестве помощника в 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

Назовите это с точки зрения:

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

Это выводит элементы <span style='font-size:_em'> в массиве, который будет преобразован в строку в представлении, чтобы в конечном итоге отобразить так:

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

Было бы лучше иметь атрибут class и ссылаться на классы в таблице стилей, как упомянул Брендан выше. Намного лучше, чем семантическое использование h1-h6, и с <span> меньше стильного багажа.

почему кто-то поставил ему -1?

berkes 15.07.2010 00:23
Ответ принят как подходящий

Вы также захотите добавить к нему логарифмическую функцию. (взято из tagadelic, моего модуля Drupal для создания облаков тегов 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);
}

Затем в вашем представлении или шаблоне:

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

Этот метод предназначен для фанатиков SQL/PostgreSQL. Он выполняет всю работу в базе данных и печатает текст с «кратковременной» ссылкой. Он использует Doctrine ORM только для вызова sql, я не использую объекты. Допустим, у нас есть 10 размеров:

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

затем вы распечатываете их с помощью некоторого класса CSS, от .tagranking10 (лучший) до .tagranking1 (худший):

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

а это 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 */

Этот метод отображает все теги. Если у вас их много, вы, вероятно, не хотите, чтобы ваше облако тегов превратилось в тег шторм. В этом случае вы должны добавить предложение HAVING TO в свой SQL-запрос:

-- minimum tag count is 8 --

HAVING count(tag) > 7

Вот и все

Я знаю, что это очень старый пост, но я все же публикую свое мнение, так как оно может кому-то помочь в будущем.

Вот облако тегов, которое я использовал на своем веб-сайте: 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>";
}
?>

Другие вопросы по теме