Сейчас: 03:45:10   26-го апреля 2024 г.
27
92

Построение диаграмм при помощи PHP

Наверняка многие уже задумывались о том, как на своем собственном сайте реализовать диаграммы. Есть, конечно, различные плагины, но в них, как правило, есть много лишнего и хочется что-нибудь свое.


В данной теме мы хотим предложить Вам довольно простой способ построения диаграммы на своем сайте на основе имеющегося массива данных. В рассматриваемом примере мы получаем нужный нам массив из MySQL. В массиве содержится 30 записей с количеством оценок, поставленных темам по дням.


Что из этого получилось, Вы можете наблюдать на скриншоте ниже:


Простая диаграмма на PHP

Для построения диаграммы, как на скриншоте выше, для начала необходимо прописать стили, которые будут нами использоваться в рассматриваемом скрипте для отображения столбцов. Для этого поместите между тегами <head> и </head> вот такой код:

HTML код:
<style type="text/css">
 .
column height:400pxwidth:18px; }
 .
column div border:1px solid blackbackground:#090; width:16px; margin:-1px 0; }
 
.chart background:url(image/chart.pngno-repeatpadding:4px; }
 .
height40 height:40px; }
</
style>

Теперь можно переходить к строительству диаграммы. Для этого необходимо, чтобы у Вас был какой-нибудь массив данных, который бы содержал даты и значения, соответствующие этим датам. В рассматриваемом нами скрипте предполагается, что этот массив мы получаем из MySQL базы, и даты там хранятся в формате unixtime.


Собственно вот скрипт, который отвечает за построение диаграммы:

PHP код:
<?php
echo '<table cellspacing="10" cellpadding="0" width="100%">';
 echo 
'<tr style="font-size:13px;">';
  echo 
'<td align="right">';

$days=30;
for (
$n=0$n<=$days$n++) $arr_date[]=date('Y m d',strtotime("-$days day+$n day"));
$period=floor(strtotime("-$days day")/86400)*86400;

$max=0$number=0;
$res=mysqli_query($db,"SELECT count(id), FROM_UNIXTIME(date,'%Y %m %d') AS dat
FROM ocenki WHERE date>'"
.$period."' GROUP BY dat ORDER BY dat");
while (
$arr_stat[]=mysqli_fetch_array($res)) {
    if (
$max<$arr_stat[$number][0]) $max=$arr_stat[$number][0];
    
$number++;
}
$max=ceil($max/10)*10;
for (
$n=1$n<=11$n++) {
    echo 
'<div style="height:40px;">'.round($max-$max*($n-1)/10).'</div>';
}
echo 
'</td><td valign="bottom">';
echo 
'<table style="background:url(1.png) no-repeat;padding:4px;" border="0"
    cellspacing="3" cellpadding="0">'
;
echo 
'<tr valign="bottom">';

for (
$n=0$n<=$number$n++)
    
$new_stat[array_search($arr_stat[$n]['dat'],$arr_date)]=$arr_stat[$n];


for (
$n=1$n<count($arr_date); $n++) {
    echo 
'<td class="column">';
    if (isset(
$new_stat[$n][0])) echo '<div style="height:'.
    
floor(400/$max*$new_stat[$n][0]).'px;" title="'.$new_stat[$n][0].'"></div>';
    echo 
'</td>';
}

echo 
'</tr><tr style="font-size:13px;height:20px;" align="center">';
for (
$n=1$n<count($arr_date); $n++) echo '<td>'.substr($arr_date[$n],-2).'</td>';
array_splice($arr_stat,'');
array_splice($new_stat,'');
echo 
'</tr></table>';

echo 
'</td></tr></table>';
?>

Теперь давайте остановимся и рассмотрим подробнее некоторые моменты. Как Вы могли догадаться, $days содержит количество дней по шкале X (в примере их 30), а $arr_date[] - последние 30 дат в виде массива, которые будут располагаться под шкалой X. $period соответствует времени 0 часов 00 минут первой даты массива $arr_date[]. Данная переменная нужна для правильного задания интервала в MySQL запросе, т.к. даты у нас в формате unixtime.


Далее мы при помощи запроса извлекаем из базы все записи за последние 30 дней и помещаем их в массив $arr_stat[]. Таким образом, в $arr_stat[] содержится количество оценок за день и дата этого дня (уже в формате "год месяц день"). Одновременно в переменную $max мы заносим максимальное количество оценок за день из всех полученных из MySQL записей. Далее строчкой $max=ceil($max/10)*10; мы округляем максимальное значение в большую сторону до десятков для того, чтобы разбить шкалу Y на 10 ровных интервалов.


Потом, при помощи обычного цикла создаем шкалу значений по Y, и переходим непосредственно к построению диаграммы. Обратите внимание, что у таблицы в стиле прописана картинка 1.png - это сетка, которую мы нарисовали, чтобы украсить диаграмму и сделать ее более наглядной и читабельной. Т.к. в скрипте высота одного интервала по шкале Y равна 40 пикселям, то и на сетке интервалы между линиями тоже равны 40 пикселям.


Сетка для диаграммы на PHP

Далее скрипт автоматически высчитывает высоту каждого столбца относительно максимального значения и выводит его на экран в виде блока DIV с заливкой с указанной высотой.


Функция substr($arr_date[$n],-2) обрезает дату при выводе и выводит только дни месяца. Функции array_splice($arr_stat,''); и array_splice($new_stat,''); очищают массивы $arr_stat и $new_stat. Это нужно для того, чтобы в случае построения двух и более диаграмм не произошло добавление значений второй диаграммы к предыдущей.

Дата создания: 20:32:14 03.10.2013 г.
Посещений: 15175 раз(а).

Комментарии посетителей (6 шт.):
Дмитрий
-1
# 3071
(10:59:48  09.03.2016 г.)

Не строит график, и вопрос. $res=mysqli_query($db,"SELECT count(id), FROM_UNIXTIME(date,'%Y %m %d') AS dat FROM ocenki WHERE date>'".$period."' GROUP BY dat ORDER BY dat");
"dat" это что?
Ответить

Administrator
1
# 3072
(19:52:08  09.03.2016 г.)

Все работает. Главное укажите правильный столбец вместо ocenki и убедитесь, что в нем присутствуют нужные данные. dat это новое имя столбца, содержащего дату вида: "Год Месяц День".
Ответить

sibroy
0
# 3711
(15:30:15  30.01.2017 г.)

А какой нужно сделать запрос в базу данных Mysql, что бы создать таблицу под этот скрипт?
Ответить

sittor
0
# 4070
(18:09:03  11.09.2017 г.)

Судя по описанию, таблица уже должна быть, из неё и получаете данные для построения графика.
Ответить

Владимир
0
# 4131
(10:35:18  13.11.2017 г.)

Прошу помощи начинающему... Вот есть база mysql в ней есть серийный номер устройства, значение параметра, дата когда значение было записано в базу. Надо построить график, где х-дата, у-значения. Ваш вариант построения, на мой взгляд, мне подходит. Но не получается изменить часть кода, где идет выборка из базы.
Т.е. отдельно такой код выборки данных для графика работает:
.....
$db=mysql_connect('localhost','root','pfhbycr');
mysql_select_db('test',$db);
//echo "$db_table"."</p>";
$zapros="SELECT sn, data, lv FROM $db_table WHERE sn='$sn1'";
$RESULT=mysql_query("$zapros",$db);
//echo "$RESULT </p>";
//echo "<a>res</a>"."</p>";
{
while($row=mysql_fetch_array($RESULT))
//$array_main=array($row);
//$array_id=array(data);
//$rw=array_multisort($row, $sn1, data);
{
$ttt=$row['data'];
//$tttt=$row['sn'];
$dd=$row['lv'];
echo "$ttt "." $dd"."</p>";
Здесь выборка по серийнику и далее...
Выдает как таблицу - значение, дата.
Как поправить Ваш код, чтоб получать данные из базы?
Ответить

михаил
1
# 5000
(19:19:23  13.08.2023 г.)

Хороший пример, но обновить все же статью нужно.
Ответить

Закрыть
Ваше имя:
449 + 13 =
Добавить комментарий:
Ваше имя:
449 + 13 =

Перед публикацией все комментарии проходят обязательную модерацию!

Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Посетителей онлайн: 6

Какой браузер Вы используете?