Спиральное облако тэгов

Тэги стали отличительным свойством 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;
    }

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

  • Зависят ли тэги от языка статей/объектов?
  • Организованы ли слова между собой в дерево категорий что-бы избежать проблем различного семантического значения?
  • Ограничены существительными, длиной символов или знаками?
  • Чуствительны к регистру?

По теме можно посмотреть