Pers.narod.ru. PHP. Скрипт построения круговой диаграммы на PHP |
Скрипт рисует круговую диаграмму с подписями для секторов по данным, переданным через строку параметров URL (методом GET) и выводит относительные величины полученных секторов в процентах. Сектора, которые должны занимать менее 2% площади круга, не рисуются. Если раскомментарить строку, помеченную в листинге, такие сектора будут присоединяться к следующему сектору.
Скрипт реагирует на следующие параметры URL:
h=число
- ширина генерируемого рисунка в пикселах, от 100 до 1000 включительно, по умолчанию 300;
w=число
- высота генерируемого рисунка в пикселах, от 100 до 1000 включительно, по умолчанию 300;
f=число
- размер шрифта (пункты), в котором выводятся подписи, от 8 до 72 включительно, по умолчанию 13;
d=число1,подпись1;...;числоN,подписьN
- относительные значения категорий диаграммы и подписи к категориям, записи разделены символом ;, внутри одной записи число отделяется от строки подписи символом запятойСкрипт написан очень быстро и в процессе совсем другой работы, поэтому его код неоптимален и возможны, например, такие ширина и высота рисунка, при которых надписи расположатся на секторах "некрасиво", при значениях по умолчанию и не слишком длинных подписях всё должно выглядеть нормально.
Наличие расширения GD (библиотеки GDLib для динамической работы с изображениями) проверяется в самом начале:
if (!extension_loaded('gd')) { echo "Библиотека GDLib недоступна!"; exit(); }
Затем скрипт пытается поставить российскую локаль, перебирая распространённые варианты написания - увы, стандарта здесь нет и всё зависит от операционки сервера:
$arrLocales = array('ru_RU.CP1251', 'ru_RU.cp1251', 'ru_RU', 'RU'); $booLocaleSet = false; foreach ($arrLocales as $strLocaleName) { if ((bool)$booLocaleSet === false) setlocale(LC_ALL, $strLocaleName); if ((bool)$booLocaleSet === false && strtolower("АБГДЯQWERTYZ") == "абгдяqwertyz") { $booLocaleSet = true; break; } }
Второе "увы" - встроенные в PHP шрифты не имеют региональной части символов (в нашем случае — кириллицы), и даже при использовании стандартного метода imagettftext из библиотеки GDLib плюс кириллического шрифта, вместо русского текста всё равно выводятся кракозябры. Скрипт пытается решить эту проблему с помощью собственной функции str_rus
:
function str_rus ($str){ $nstr=''; for ($i=0; $i<strlen($str); $i++) { $symbol=substr($str,$i,1); $ascii=ord($symbol); if ($ascii < 128){ $nstr .= $symbol; } elseif ($ascii > 191 and $ascii < 256) { $nstr .= '&#'. (string)(848 + ord($symbol)).';'; } elseif ($ascii == 184) { // ё $nstr .= 'ё'; } elseif ($ascii == 168) { // Ё $nstr .= 'Ё'; } elseif ($ascii == 150) { // – $nstr .= '-'; } else { $nstr .= $symbol; } } return ($nstr); }
У меня работает и на локалхосте под Windows, и на сервере под FreeBSD.
С другой стороны, чтобы не мучиться с setlocale
или number_format
(на разных хостах и в разных ОС могут быть разные локали для отображения вещественных чисел, например, целая часть числа может отделяться от дробной как точкой, так и запятой), все числа из данных предполагаются целыми.
Пример вызова скрипта:
http://сервер/sectordiagram/?d=1,конфета;2,пряник;3,Ёшкин кот
- при условии, что index.php
назначено как имя документа по умолчанию, иначе
http://сервер/sectordiagram/index.php?d=1,конфета;2,пряник;3,Ёшкин кот
Вот что выдаст такой вызов:
Некоторые браузеры, например Google Chrome, при таком вызове всё равно покажут кракозябры, потому что по стандартам в URL допускаются только символы с кодами 33-127, а к кириллице надо применять
двухбайтовое URL-кодирование в UTF-8
(метод urlencode
в PHP) и наш запрос должен выглядеть так:
http://сервер/sectordiagram/?d=1,%EA%EE%ED%F4%E5%F2%E0;2,%EF%F0%FF%ED%E8%EA;3,%A8%F8%EA%E8%ED%20%EA%EE%F2
Просто русифицированные Internet Explorer, Opera и Firefox закодируют URL автоматически.
В архиве также содержится файл шрифта arial.ttf из Windows XP SP3, разумеется, его можно заменить другим файлом шрифта TTF.
Скрипт в работе (вызов с показанными выше параметрами)
Архив .ZIP со скриптом (196 Кб)
гостевая; E-mail |