Скрипт "Облако тегов"
Меня попросили написать 2 статьи: первая об организации облака тегов на сайте, а вторая о создании блока списка пользователей, которые находятся на сайте.
Попробую расписать, как организовать облако тегов на сайте. Завязку на базу данных не буду делать, будем считать, что у нас на входе есть одномерный массив, такого вида:
$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")
);
?>
Т.е. именно такой массив мы должны были бы получить из базы данных, если мы ее использовали в этом примере, т.е. для каждой страницы/статьи в базе существует список тегов, именно эти теги преобразуем в такой вида массив.
Далее преобразуем его в массив вида (хотя это можно было и в запросе к базе, но немного разжую момент):
$cloudArrayTotal = array();
foreach ($cloudArray as $cloud) {
if (isset($cloudArrayTotal[$cloud['tag']]))
$cloudArrayTotal[$cloud['tag']]['count']++;
else
$cloudArrayTotal[$cloud['tag']]['count'] = 1;
}
?>
В этом куске кода мы преобразуем начальный массив в массив вида:
(
[cms] => Array
(
[tag] => cms
[count] => 2
)
[php] => Array
(
[tag] => php
[count] => 5
)
[mysql] => Array
(
[tag] => mysql
[count] => 3
)
...
Что дает нам понять, какой из тегов самый часто встречающийся, а какой нет.
Основная задача выделить наиболее часто встречающиеся теги. Для этого будем использовать CSS-стили. Создадим 4 стиля, 3 для выделения часто встречающихся тегов, а один основной, который будет характеризовать не самые встречающиеся теги.
a.cloud20 {
font-size: 20px;
}
a.cloud16 {
font-size: 16px;
}
a.cloud12 {
font-size: 12px;
}
a.cloud10 {
font-size: 10px;
}
</style>
Стили можете создать свои, можете разукрасить разными цветами.
Далее каждому из тегов проставляем будущий стиль
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;
}
?>
У нас получится что-то вроде такого:
(
[0] => Array
(
[tag] => php
[count] => 5
[size] => 18
)
[1] => Array
(
[tag] => mysql
[count] => 3
[size] => 14
)
[2] => Array
(
[tag] => cms
[count] => 2
[size] => 10
)
...
Собственно УРА, осталось это только вывести, хотя перед этим можете отсортировать массив так, как Вам хочется. Код вывода будет выглядеть так:
foreach ($cloudArrayTotal as $value) {
echo ' <a href="/cloud/'.$value['tag'].'" class="cloud'.$value['size'].'">'.$value['tag'].'</a>';
}
?>
На выходе получаем красивое облако тегов. Код можно сократить раза в два, если использовать базу данных, так что экспериментируйте или задавайте вопросы, помогу.

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

bbcode,
кроме самого тега можно ввести маркировку и именно ее использовать для подстановки в URL, например:
$cloudArray = array(
array("tag"=>"Облако тегов", mark=>"clouds")
);
Отвечу на вопросы по PHP
