А теперь рассмотрим практический пример скрипта для "табличного" вывода диаграммы.
#!/usr/bin/perl
#Исходные данные для вывода диаграммы #массив $data - данные для вывода (уже в пикселях). #$val - количество выводимых столбцов (соотв количеству элементов $data).
#Ниже расположен код сортировки выводимых на диаграмме значений #В процессе его работы на основе массива @data создается отсортированный #массив @stp и хэш %lvl с количеством столбцов таблицы для каждого #столбика диаграммы
while($x<=$rows && $p==0) { if ($data[$i]==$stp[$x]){$p=1;$lvl{$data[$i]}=$x;goto a1;};
if ($data[$i]<$stp[$x]){ #Вставка нового значения в середину массива @stp for ($y=$rows+1;$y>=$x;$y=$y-1){$stp[$y+1]=$stp[$y];}; $stp[$x]=$data[$i]; #Корректируем хэш %lvl с учетом сдвига @stp foreach $itm(keys %lvl){if ($lvl{$itm}>=$x){$lvl{$itm}=$lvl{$itm}+1;};}; $lvl{$data[$i]}=$x; $rows=$rows+1; $p=1; };
$x++; };
if ($p==0){$rows=$rows+1;$stp[$rows]=$data[$i]; $lvl{$data[$i]}=$rows};
#Выводим первую строку таблицы, задающую броузеру нужные ширины ячеек #Она не будет отображаться, т.к. ячейки пустые for ($k=1;$k<=$rows;$k=$k+1){ $w=$stp[$k]-$stp[$k-1]; print <TD width=$w></TD>; }; print </TR>n;
#Выводим строки, содержащие диаграмму for ($v=1;$v<=$val;$v=$v+1){ $tl=$lvl{$data[$v]}; $rst=$rows-$tl; print <TR>; #Если видимая ячейка есть (выводимое значение не 0: $tl>0), #то выводим ее: if ($tl>0) {print <TD bgcolor=$color[$v] colspan=$tl> </TD>;};
#Если невидимая ячейка есть (выводимое значение не равно максимальному), #то выводим ее: if ($rst>0) {print <TD colspan=$rst></TD>;};
print </TR>n; }; print </TR></TABLE>;
Т.к. приведенный здесь программный код в качестве исходных данных использует уже "готовые" значения в пикселах (а не собственно выводимые величины в их исходном виде), то перед его использованием необходимо преобразовать выводимые величины (скажем, проценты) в количества пикселей с учетом желаемой ширины диаграммы.
Допустим, нам надо вывести результаты голосования, которые передаются в переменных $za, $prot, $vozd в значениях процентов.
В ряде случаев Вам может понадобиться явно задать толщину столбиков диаграммы, т.е. высоту строк таблицы. И здесь Вам встретится еще один "подводный камень" данного решения. Дело в том, что параметры width и height тэга <TD> задают не однозначные, а минимальные значения ширины и высоты ячейки таблицы. Т.е. если "по содержимому" ячейка меньше, чем указано в параметрах width и height, то она "растягивается" до нужных размеров.
Наш пример вообще не задает в тэгах <TD> параметр height, поэтому высота ячеек таблицы определяется размерами шрифта, которым "написан" символ в видимой ячейке (несмотря на то, что это символ пробела, он, как и любой другой символ, имеет свою высоту) и отступом между "абзацем" и границами ячейки. Соответственно, если не принять дополнительных мер, то на разных страницах и у разных посетителей выглядеть несколько по-разному.
"Общим видом решения" этой задачи является минимизация собственной высоты ячейки и задание ее высоты с помощью параметра height тэга <TD>.
Самым "радикальным" способом уменьшения высоты является помещение в видимую ячейку вместо & нетекстового содержимого, скажем, картинки размером 1x1 пиксель:
<IMG width=1 height=1 src=trans.gif>
а в trans.gif поместить прозрачное изображение в 1 пиксель.
Тогда "собственная" высота ячеек получится очень мала (несколько пикселей) и параметром height и Вы сможете однозначно задавать высоту ячеек таблицы-диаграммы, а следовательно, и толщину столбиков.
Еще одним способ уменьшить "собственную" высоту ячеек - максимально уменьшить размер шрифта в "видимой" ячейке.