Тэги стали отличительным свойством web 2.0, но уже несколько лет с его изобретения, они остаются в своём изначальном виде — взвешенным по частоте использования набору слов со случайной или алфавитной сортировкой между собой. Я подумал что неплохо бы их расположить в виде настоящего облака — главные слова по центру, остальные по периметру и встала чисто техническая задача переделать упорядоченный по убыванию массив в двумерную матрицу где слова располагались бы по спирали (см позиционирование ниже).
72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
71 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 82 |
70 | 41 | 20 | 21 | 22 | 23 | 24 | 25 | 50 | 83 |
69 | 40 | 19 | 6 | 7 | 8 | 9 | 26 | 51 | 84 |
68 | 39 | 18 | 5 | 0 | 1 | 10 | 27 | 52 | 85 |
67 | 38 | 17 | 4 | 3 | 2 | 11 | 28 | 53 | 86 |
66 | 37 | 16 | 15 | 14 | 13 | 12 | 29 | 54 | 87 |
65 | 36 | 35 | 34 | 33 | 32 | 31 | 30 | 55 | 88 |
64 | 63 | 62 | 61 | 60 | 59 | 58 | 57 | 56 | 89 |
99 | 98 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 |
Я не стал тут описывать как это облако нарисовать div-но в html или как сделать наглядной картинку слов при помощи логарифмов когда их частота использования может в сотни раз различаться. Основная загвоздка стала в создании матрицы. Поэтому я написал относительно простую функцию без координат, синусов и косинусов: function spiralSort(&$arrWords){
$maxDiameter=ceil(sqrt(count($arrWords)));
$intMx=ceil($maxDiameter/2)-1;
$intMy=ceil($maxDiameter/2)-1;
$intMr=1; //radius
$intMp=0; //position
$intTurn=1; //position
foreach($arrWords as $key=>&$arrWord){
$arrMatrix[$intMx][$intMy]=$arrWord;
$intMp++;
switch($intTurn){
case 1: $intMx++; break;
case 2: $intMy++; break;
case 3: $intMx--; break;
case 4: $intMy--; break;
}
//changing direction
if(!($intMp % $intMr)){
$intTurn++;
if($intTurn==2 || $intTurn==4){
//$intMx++;
$intMr++;
}
if($intTurn==5){
$intTurn=1;
}
}
}
return $arrMatrix;
}
Теперь наглядно видны наиболее используемые слова которые я ранее получил при индексации. Для тех кто ещё задумывается как организовывать тэги, предлагаю задуматься над вопросами
- Зависят ли тэги от языка статей/объектов?
- Организованы ли слова между собой в дерево категорий что-бы избежать проблем различного семантического значения?
- Ограничены существительными, длиной символов или знаками?
- Чуствительны к регистру?
По теме можно посмотреть
- Пример алфавитного облака
- Одна из видов организации тэгов
- Категоризация тэгов