Пользователи онлайн
Боты: Google Bot, guest, Inktomi Slurp

Всего: 3


Подписаться на RSS

Скрипт "Облако тегов"

Меня попросили написать 2 статьи: первая об организации облака тегов на сайте, а вторая о создании блока списка пользователей, которые находятся на сайте.

Попробую расписать, как организовать облако тегов на сайте. Завязку на базу данных не буду делать, будем считать, что у нас на входе есть одномерный массив, такого вида:

<?php
$cloudArray = array(
array("tag"=>"cms"),
array("tag"=>"php"),
array("tag"=>"mysql"),
array("tag"=>"php"),
array("tag"=>"php"),
array("tag"=>"Облако тегов"),
array("tag"=>"class"),
array("tag"=>"mysql"),
array("tag"=>"php"),
array("tag"=>"session"),
array("tag"=>"cms"),
array("tag"=>"капча"),
array("tag"=>"php"),
array("tag"=>"mysql")
);
?>

Т.е. именно такой массив мы должны были бы получить из базы данных, если мы ее использовали в этом примере, т.е. для каждой страницы/статьи в базе существует список тегов, именно эти теги преобразуем в такой вида массив.

Далее преобразуем его в массив вида (хотя это можно было и в запросе к базе, но немного разжую момент):

<?php
$cloudArrayTotal = array();
foreach ($cloudArray as $cloud) {
if (isset($cloudArrayTotal[$cloud['tag']]))
$cloudArrayTotal[$cloud['tag']]['count']++;
else
$cloudArrayTotal[$cloud['tag']]['count'] = 1;
}
?>

В этом куске кода мы преобразуем начальный массив в массив вида:

Array
(
[cms] => Array
(
[tag] => cms
[count] => 2
)

[php] => Array
(
[tag] => php
[count] => 5
)

[mysql] => Array
(
[tag] => mysql
[count] => 3
)
...

Что дает нам понять, какой из тегов самый часто встречающийся, а какой нет.

Основная задача выделить наиболее часто встречающиеся теги. Для этого будем использовать CSS-стили. Создадим 4 стиля, 3 для выделения часто встречающихся тегов, а один основной, который будет характеризовать не самые встречающиеся теги.

<style>
a.cloud20 {
font-size: 20px;
}

a.cloud16 {
font-size: 16px;
}

a.cloud12 {
font-size: 12px;
}

a.cloud10 {
font-size: 10px;
}
</style>

Стили можете создать свои, можете разукрасить разными цветами.

Далее каждому из тегов проставляем будущий стиль

<?php
function _sort($x, $y) {
return strcmp ($y['count'], $x['count']);
}

usort($cloudArrayTotal, "_sort");

$previousCount = 999999;
$previousSize = 24;

foreach ($cloudArrayTotal as $key=>$row) {
if ($row['total']<$previousCount) {
$previousCount = $row['count'];
$previousSize -= 4;
if ($previousSize < 10)
$previousSize = 10;
}

$cloudArrayTotal[$key]['size'] = $previousSize;
}
?>

У нас получится что-то вроде такого:

Array
(
[0] => Array
(
[tag] => php
[count] => 5
[size] => 18
)

[1] => Array
(
[tag] => mysql
[count] => 3
[size] => 14
)
[2] => Array
(
[tag] => cms
[count] => 2
[size] => 10
)
...

Собственно УРА, осталось это только вывести, хотя перед этим можете отсортировать массив так, как Вам хочется. Код вывода будет выглядеть так:

<?php
foreach ($cloudArrayTotal as $value) {
echo ' <a href="/cloud/'.$value['tag'].'" class="cloud'.$value['size'].'">'.$value['tag'].'</a>';
}
?>

На выходе получаем красивое облако тегов. Код можно сократить раза в два, если использовать базу данных, так что экспериментируйте или задавайте вопросы, помогу.

bbcode, 08.07.2010 16:24:48

А если теги написаны по русски, как строить ссылки?



Жизнь игра? А где вторая попытка?

programmer, 09.07.2010 09:03:02

bbcode,

кроме самого тега можно ввести маркировку и именно ее использовать для подстановки в URL, например:

$cloudArray = array(

 array("tag"=>"Облако тегов", mark=>"clouds")

);

 



Отвечу на вопросы по PHP

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться