Nickolay.info. PHP. Скрипт построения круговой диаграммы на PHP

Скрипт рисует круговую диаграмму с подписями для секторов по данным, переданным через строку параметров URL (методом GET) и выводит относительные величины полученных секторов в процентах. Сектора, которые должны занимать менее 2% площади круга, не рисуются. Если раскомментарить строку, помеченную в листинге, такие сектора будут присоединяться к следующему сектору.

Скрипт реагирует на следующие параметры URL:

Скрипт написан очень быстро и в процессе совсем другой работы, поэтому его код неоптимален и возможны, например, такие ширина и высота рисунка, при которых надписи расположатся на секторах "некрасиво", при значениях по умолчанию и не слишком длинных подписях всё должно выглядеть нормально.

Наличие расширения 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 .= '&#1105;';
  } 
  elseif ($ascii == 168) { // Ё
   $nstr .= '&#1025;';
  } 
  elseif ($ascii == 150) { // –
   $nstr .= '&#45;';
  }
  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,Ёшкин кот

Вот что выдаст такой вызов:

Пример вывода круговой диаграммы на PHP

Некоторые браузеры, например 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 Кб)

Рейтинг@Mail.ru

вверх гостевая; E-mail