pChart Fatal error: Uncaught Error: Cannot use string offset as an array in

Продолжаю ловить ошибки перевода проекта с PHP 5.4 на PHP 7.2 😉 На этот раз обнаружилось что pChart используемый в части отчетов скорее мертв чем жив, а последнее обновление на официальном сайте от 2014 года. Но! Как всегда нашлись энтузиасты, которые создали форк, в котором в 2.1х ошибки совместимости с PHP 7.2 устранены и выпущена ветка 2.2, не совместимая с pChart 2.1x

https://github.com/bozhinov/pChart2.0-for-PHP7/tree/7.x-compatible

https://github.com/bozhinov/pChart2.0-for-PHP7/tree/2.2

Рисуем красивые графики на PHP

Первоначально я рисовал графики при помощи Pchart (http://www.pchart.net/), однако что мне жутко в них не нравилось — это статичность изображения. Т.е. на выходе ты получаешь готовую красивую картинку, например, что-то вроде:

repplat

 

, но как я уже говорил — это просто статичная картинка, и никаких эффектов вроде плавного анимированного построения графика, подсветки значений при наведении курсора и т.п. никак не достичь.

Принялся за поиски другой библиотеки — на этот раз на основе JavaScript. Сперва смотрел в сторону широко разрекламмированой D3, но высокий «порог вхождения» остановил. Да, там можно реализовать «вообще всё что хочешь», но потратить полдня на то чтоб разобраться как построить элементарный график…

Посему далее стал смотреть в сторону http://www.chartjs.org/ . Там графики уже намного приятнее — анимация, простой код для отрисовки. Но! Так и не понял по какой причине, в библиотеке не реализована элементарная функция «легенда», а так-же отображение значений данных при не наведенном курсоре. Бред.

Снимок экрана из 2015-05-25 14:01:12Хорошо наткнулся на форк этой библиотеки — ChartsNew, который всё это позволяет делать «из коробки»:

Снимок экрана из 2015-05-25 14:06:04Основная трудность конечно при работе с JavaScript библиотеками для построения графиков из PHP, это конечно то, что приходится генерировать JavaScript код при помощи PHP, т.е. код становится «вермишелью» вроде вот этого: » Читать далее

Использование Pchart для построения графиков на PHP

Классы Pchart представляют очень простой способ отрисовки графиков на PHP. Кроме того, в комплекте поставки идет «песочница», где можно визуально настроить параметры и посмотреть какой код нужно использовать для его построения,ну и собственно посмотреть как будет выглядеть примерно ваш график.

Вот пример графика

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
include("../../../../class/pchart/pData.class.php");
include("../../../../class/pchart/pDraw.class.php");
include("../../../../class/pchart/pImage.class.php");
$myData = new pData();  
 
while($date <= $dtend){
    $kof=1;
    $date = date('Y-m-d', strtotime($date.' + '.$kof.' days'));
    $ruser=GetAllStatByDate($date,$grp,$agnt,$lb);
    $activeusers=$ruser["activeusers"];
    $allaccountsb10=$ruser["allaccountsb10"];
    $allaccountsb1=$ruser["allaccountsb1"];
    $atherblock=$ruser["atherblock"];
    $allaccounts=$ruser["allaccounts"];
// добавляем данные
    $myData->addPoints($activeusers,"activeusers");
    $myData->addPoints($allaccountsb10,"allaccountsb10");
    $myData->addPoints($allaccountsb1,"allaccountsb1");
    $myData->addPoints($allaccounts,"allaccounts");
    $myData->addPoints($date,"Month");
};
// синонимы
$myData->setSerieDescription("activeusers","Активных учеток");
$myData->setSerieDescription("allaccountsb10","Блокировка 10");
$myData->setSerieDescription("allaccountsb1","Блокировка по балансу");
$myData->setSerieDescription("allaccounts","Всего учеток");
// что в низу
$myData->setAbscissa("Month");
// сто слева
$myData->setAxisUnit(1," Чел");
 
//задаем цвета графиков
$serieSettings = array("R"=>51,"G"=>255,"B"=>0,"Alpha"=>150);
$myData->setPalette("activeusers",$serieSettings);
 
$serieSettings = array("R"=>255,"G"=>38,"B"=>0,"Alpha"=>150);
$myData->setPalette("allaccountsb10",$serieSettings);
 
$serieSettings = array("R"=>255,"G"=>200,"B"=>0,"Alpha"=>150);
$myData->setPalette("allaccountsb1",$serieSettings);
 
$serieSettings = array("R"=>2,"G"=>11,"B"=>1,"Alpha"=>150);
$myData->setPalette("allaccounts",$serieSettings);
 
 
 
$myPicture = new pImage(1250,500,$myData); // <-- Размер холста
 
$Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
$myPicture->drawGradientArea(0,0,1250,500,DIRECTION_VERTICAL,$Settings);  
  
$myPicture->setFontProperties(array("FontName"=>"../../../../fonts/calibri.ttf","FontSize"=>8));
$myPicture->setGraphArea(50,20,1230,480); // <-- Размещение графика на холсте
$myPicture->drawScale();
$myPicture->drawBestFit(array("Alpha"=>40)); // <-- Прямая статистики
 
$myPicture->drawSplineChart();
$myPicture->drawPlotChart(array("DisplayValues"=>TRUE,"PlotBorder"=>TRUE,"BorderSize"=>0,"Surrounding"=>-60,"BorderAlpha"=>50)); // <-- Точки на графике
$myPicture->drawLegend(700,10,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));// <-- Размещение легенды
 
 
$unique = date("Y.m.d_H.i.s");
$gsFilename_Traffic = "traffic_".$unique.".png";
 
$myPicture->Render('../../../../files/'.$gsFilename_Traffic);
echo "<img src='files/$gsFilename_Traffic'>";