Php построение графиков excel

Обновлено: 08.07.2024

После моей статьи « Как создавать документы Microsoft Word с помощью PHP » (с использованием возможностей взаимодействия в Windows) было довольно много комментариев, призывающих к чистой реализации PHP, то есть к использованию только файлов универсальной библиотеки PHP для управления файлами Office.

В этой статье мы увидим, как использовать библиотеку PHPExcel для предоставления функции «Экспорт в Excel» в веб-приложении, чтобы пользователь мог экспортировать данные в файл Excel 2007/2013 для дальнейшего анализа.

ПРИМЕЧАНИЕ. Существует несколько библиотек PHP, которые могут обеспечивать манипуляции с файлами в Excel (и Office). Используемая здесь библиотека называется PHPExcel, подмножество PHPOffice, которое можно клонировать здесь .

После этого урока мы получим:

подготовка

Чтобы использовать PHPExcel, мы должны иметь версию PHP выше 5.2.0. Также необходимо включить 3 расширения PHP: php_zip (который необходим для работы с форматами Office 2007), php_xml и php_gd2 (необязательно, но требуется для автоматического расчета ширины столбца).

Далее установите библиотеку через Composer .

Конечно, мы должны иметь нашу базу данных и работать. Дамп данных для этого урока ( lakers.sql ) был загружен в lakers.sql связанный с этой статьей . Данные извлекаются с помощью простого оператора SQL: « select * from lakers » (всего 90 записей, в том числе 8 предсезонных и 82 игр регулярного сезона).

Кроме того, эта демонстрация использует Silex в качестве инфраструктуры MVC. Twig будет использоваться в качестве шаблонного движка. Убедитесь, что необходимые зависимости правильно указаны в вашем файле composer.json .

Индексный файл

index.php будет точкой входа для нашего приложения Silex. Будет определено два маршрута:

Приложение Excel и его метаданные

Чтобы создать экземпляр файла Excel, мы используем:

Экземпляр приложения Excel обычно сопоставляется с физическим файлом Excel. У него есть собственные метаданные для описания файла, который мы создаем. Метаданные отображаются, когда мы «Alt-Enter» файл Excel (или щелкните правой кнопкой мыши на этом файле и выберите «Свойства»):


Свойства, показанные в диалоговом окне выше, будут иметь соответствующие методы setXXXX для установки этих свойств, где XXXX практически идентичен именам свойств, перечисленным в диалоговом окне:

Методы ( setXXXX ) достаточно setXXXX и довольно хорошо отображаются в диалоге «Свойства». Есть некоторые несоответствия в отображении, но они не слишком сложны для нас, чтобы установить соединение (например, «Авторы» будут сопоставлены с setCreator ).

Рабочий лист и популяция клеток

Чтобы получить ссылку на рабочий лист, мы используем:

Листы в рабочей книге всегда индексируются 0. Таким образом, 1-й (и до сих пор единственный) лист будет Sheet Zero. Имя этого листа по умолчанию всегда «Рабочий лист», и мы можем изменить его с setTitle метода setTitle .

Для заполнения ячейки / ячеек у нас есть как минимум два варианта:

  1. Для этих заголовков, заголовков и других описательных элементов мы будем заполнять их один за другим, используя метод setCellValue .
  2. Для структурированных данных, большая часть которых поступает из оператора select SQL, мы будем использовать метод fromArray .

Метод fromArray принимает 3 параметра:
1. источник данных в виде массива;
2. значение «заполнитель», если данные равны NULL;
3. ссылка на ячейку, чтобы начать заполнение (слева направо, затем вверх).

ПРИМЕЧАНИЕ. Когда мы используем PDO для извлечения данных, просто $res = $q->fetchAll(\PDO::FETCH_ASSOC); вызов заставит возвращенный набор данных результата содержать только связанный массив, без индекса. Если fetchall вызывается без опции PDO::FETCH_ASSOC , результирующий набор будет фактически содержать два набора идентичных данных, один в связанной форме массива, другой в индексированной форме, и будет создавать дубликаты в файле Excel при использовании fromArray .

Мы также можем захотеть стилизовать строку заголовка ( ID , сезон и т. Д.). Для этого у нас также есть два способа:

Одним из способов является использование некоторых методов get для извлечения объекта стиля, который мы хотим изменить, и его изменения. Мы делаем это для стиля «фоновой заливки».

Другой заключается в объявлении массива «style» и указании стилей, которые мы хотим изменить, и на что их изменить. Затем мы используем applyFromArray для применения стилей в пакете. Здесь мы изменили шрифт и выравнивание.

Оба метода поддерживают диапазон как свой параметр ( $header='a1:h1'; ), что очень удобно.

Наконец, мы можем захотеть отрегулировать ширину столбца, чтобы они соответствовали максимальной отображаемой длине в каждом столбце:

К сожалению, это не поддерживает параметр диапазона, поэтому мы используем цикл for чтобы это произошло.

PHPExcel позволяет производить импорт и экспорт данных в excel. Применять различные стили оформления к отчетам. В общем, все на высоте. Даже есть возможность работы с формулами. Только необходимо учитывать, что вся работа (чтение и запись) должна вестись в кодировке utf-8.

Установка библиотеки

С помощью библиотеки PHPExcel можно записывать данные в следующие форматы:

  • Excel 2007;
  • Excel 97 и поздние версии;
  • PHPExcel Serialized Spreadshet;
  • HTML;
  • PDF;
  • CSV.

Импорт данных из PHP в Excel

Рассмотрим пример по формированию таблицы умножения.


Рассмотрим еще на примере три полезные инструкции:

  • $sheet->getColumnDimension('A')->setWidth(40) – устанавливает столбцу “A” ширину в 40 единиц;
  • $sheet->getColumnDimension('B')->setAutoSize(true) – здесь у столбца “B” будет установлена автоматическая ширина;
  • $sheet->getRowDimension(4)->setRowHeight(20) – устанавливает четвертой строке высоту равную 20 единицам.

Также обратите внимание на следующие необходимые для работы с отчетом методы:

  • Методы для вставки данных в ячейку:
    • setCellValue([$pCoordinate = 'A1' [, $pValue = null [, $returnCell = false]]]) — принимает три параметра: координату ячейки, данные для вывода в ячейку и третий параметр эта одна из констант типа boolean: true или false (если передать значение true, то метод вернет объект ячейки, иначе объект рабочего листа);
    • setCellValueByColumnAndRow([$pColumn = 0 [, $pRow = 1 [, $pValue = null [, $returnCell = false]]]]) — принимает четыре параметра: номер столбца ячейки, номер строки ячейки, данные для вывода в ячейку и четвертый параметр действует по аналогии с третьим параметром метода setCellValue().
    • getCell([$pCoordinate = 'A1']) — принимает в качестве параметра координату ячейки;
    • getCellByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) — принимает два параметра в виде номеров столбца и строки ячейки.

    Как мы видим, вышеприведенные методы являются парными. Поэтому мы можем работать с ячейками используя строковое или числовое представление координат. Что конечно же является дополнительным преимуществом в работе.

    Оформление отчета средствами PHP в Excel

    Очень часто возникает необходимость выделить в отчете некоторые данные. Сделать выделение шрифта или применить рамку с заливкой фона для некоторых ячеек и т.д. Что позволяет сконцентрироваться на наиболее важной информации (правда может и наоборот отвлечь). Для этих целей в библиотеке PHPExcel есть целый набор стилей, которые можно применять к ячейкам в excel. Есть конечно в этой библиотеке небольшой “минус” – нельзя применить стиль к нескольким ячейкам одновременно, а только к каждой индивидуально. Но это не создает дискомфорта при разработке web-приложений.

    Назначить стиль ячейке можно тремя способами:

    • Использовать метод applyFromArray, класса PHPExcel_Style. В метод applyFromArray передается массив со следующими параметрами:
      • fill — массив с параметрами заливки;
      • font — массив с параметрами шрифта;
      • borders — массив с параметрами рамки;
      • alignment — массив с параметрами выравнивания;
      • numberformat — массив с параметрами формата представления данных ячейки;
      • protection — массив с параметрами защиты ячейки.
      • pCellStyle – данный параметр является экземпляром класса PHPExcel_Style;
      • pRange – диапазон ячеек.

      Заливка

      Значением параметра fill является массив со следующими необязательными параметрами:

      • type — тип заливки;
      • rotation — угол градиента;
      • startcolor — значение в виде массива с параметром начального цвета в формате RGB;
      • endcolor — значение в виде массива с параметром конечного цвета в формате ARGB;
      • color — значение в виде массива с параметром начального цвета в формате RGB.

      Или можно использовать следующие методы:

      Вставка изображений

      Довольно редко, но бывает полезным произвести вставку изображения в отчет. Это может быть логотип, схема и т.д. Для работы нам понадобятся следующие методы:

      • setPath([$pValue = '', [$pVerifyFile = true]]) — данный метод принимает два параметра. В качестве первого параметра указывается путь к файлу с изображением. А второй параметр имеет смысл указывать, если необходимо осуществлять проверку существования файла (может принимать одно из значений true или false).
      • setCoordinates([$pValue = 'A1'])) — принимает на вход один параметр в виде строки с координатой ячейки.
      • setOffsetX([$pValue = 0]) — принимает один параметр со значением смещения по X от левого края ячейки.
      • setOffsetY([$pValue = 0]) — принимает один параметр со значением смещения по Y от верхнего края ячейки.
      • setWorksheet([$pValue = null, [$pOverrideOld = false]]) — этот метод принимает на вход два параметра. Первый является обязательным, а второй нет. В качестве первого параметра указывается экземпляр класса PHPExcel_Worksheet (текущий активный лист). Если в качестве значения второго параметра передать true, то если лист уже был назначен ранее – произойдет его перезапись и соответственно изображение удалится.

      Код демонстрирующий алгоритм вставки изображения приведен ниже:

      Вот так выглядит отчет со вставленным изображением:


      Шрифт

      В качестве значения параметра font указывается массив, который содержит следующие необязательные параметры:

      • name — имя шрифта;
      • size — размер шрифта;
      • bold — выделять жирным;
      • italic — выделять курсивом;
      • underline — стиль подчеркивания;
      • strike — перечеркнуть;
      • superScript — надстрочный знак;
      • subScript — подстрочный знак;
      • color — значение в виде массива с параметром цвета в формате RGB.

      Или воспользоваться следующими методами:

      Рамка

      В качестве значения параметра borders указывается массив, который содержит следующие необязательными параметры:

      • тип рамки — (top|bootom|left|right|diagonal|diagonaldirection);
      • style — стиль рамки;
      • color — значение в виде массива с параметром цвета в формате RGB.

      Так же можно прибегнуть к использованию следующих методов:

      $PHPExcel_Style->getBorders()->getLeft()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080')));

      $PHPExcel_Style->getBorders()->getRight()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080')));

      $PHPExcel_Style->getBorders()->getTop()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080')));

      $PHPExcel_Style->getBorders()->getBottom()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080')));

      $PHPExcel_Style->getBorders()->getDiagonal()->applyFromArray(array(‘style’ => PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080')));

      $PHPExcel_Style->getBorders()->setDiagonalDirection(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080'))).

      Выравнивание

      Значением параметра alignment является массив, который принимает на вход четыре необязательных параметра:

      • horizontal — константа горизонтального выравнивания;
      • vertical — константа вертикального выравнивания;
      • rotation — угол поворота текста;
      • wrap — разрешить перенос текста;
      • shrinkToFit — изменять ли размер шрифта при выходе текста за область ячейки;
      • indent — отступ от левого края.

      Или использовать следующие методы:

      Формат представления данных

      Параметр numberformat представляет собой массив, который включает только один параметр: code — формат данных ячейки.

      А можно и воспользоваться методом:

      Защита ячеек

      В качестве значения параметра protection выступает массив, который содержит два необязательных параметра:

      • locked — защитить ячейку;
      • hidden — скрыть формулы.

      Или использовать следующие методы:

      Теперь мы знаем, какие есть настройки стилей и какие присутствуют параметры у каждого стиля. Сейчас мы к ячейкам таблицы применим стиль оформления, но проделаем это тремя способами. Первый способ заключается в создании массива настроек, который в качестве параметра мы передадим в метод applyFromArray, класса PHPExcel_Style.

      Далее мы применим созданный нами стиль к ячейкам excel.

      Сейчас применим тот же стиль, но используя другую методику.

      Вот что у нас получилось:


      Для получения данных о стиле конкретной ячейки необходимо использовать один из следующих методов, который вернет экземпляра класса PHPExcel_Style:

      • getStyleByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) – применяется если требуется обратиться к ячейке по числовым координатам. Методу необходимо передать два параметра в виде номеров столбца и строки ячейки;
      • getStyle([pCellCoordinate = 'A1']) – используется для обращения по строковой координате ячейки. Методу требуется передать один параметр, это строковое представление координаты.

      А теперь рассмотрим третий способ назначения стиля ячейкам путем дублирования стиля. Пример использования представлен ниже (предполагается, что к ячейке “B2” применен некий стиль и мы его хотим продублировать для диапазона ячеек “F2:F10”):

      Добавление комментариев

      Я думаю, что не часто кто-то пользуется возможностью добавления комментариев к ячейкам, но это сугубо мое личное мнение, однако такая возможность имеется. Добавить комментарий к ячейке довольно просто, что видно из примера ниже:

      Следует заметить, что при повторном вызове метода createTextRun() новый комментарий добавится к уже существующему, а не заменит его. Следует отметить, что данный метод возвращает объект класса PHPExcel_RichText_Run, у которого имеются методы для установки и получения параметров шрифта:

      • getFont() – возвращает объект класса для работы со шрифтами PHPExcel_Style_Font.
      • setFont([$pFont = null]))]) – данному методу требуется передать в качестве параметра объект класса PHPExcel_Style_Font.

      Вот какой комментарий мы должны получить:


      Вставка ссылки

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

      Чтение данных из Excel

      Формировать отчеты и применять к ним стили это конечно отлично. Но на этом возможности библиотеки PHPExcel не заканчиваются. Ну что же, посмотрим на что она еще способна. А способна она еще и читать данные из файлов формата *.xls / *.xlsx.

      С помощью библиотеки PHPExcel можно читать следующие форматы:

      • Excel 2007;
      • Excel 5.0/Excel 95;
      • Excel 97 и поздние версии;
      • PHPExcel Serialized Spreadshet;
      • Symbolic Link;
      • CSV.

      Для работы нам понадобятся объекты двух классов:

      • PHPExcel_Worksheet_RowIterator – используется для перебора строк;
      • PHPExcel_Worksheet_CellIterator – используется для перебора ячеек.

      Для демонстрации выведем данные из таблицы с информацией об автомобилях.


      Пример чтения файла представлен ниже:

      Первый вариант

      Второй вариант


      В первом варианте мы производим чтение данных, из ячеек используя итераторы. А во втором, мы используем индексную адресацию для обращения и получения данных из ячеек листа. Получить данные о количестве строк и столбцов, можно воспользовавшись следующими методами класса PHPExcel_Worksheet:

      • getHighestColumn() – возвращает символьное представление последнего занятого столбца в активном листе. Обратите внимание: не индекс столбца, а его символьное представление (A, F и т.д.);
      • getHighestRow() – возвращает количество занятых строк в активном листе.

      Другие полезные методы

      Возможностей по работе с отчетами формата excel с использованием PHP как мы видим, достаточно много. Но мы рассмотрим еще несколько полезных методов, которые могут оказаться весьма полезны в работе:

      • getMergeCells() – с помощью данного метода принадлежащего классу PHPExcel_Worksheet можно получить информацию обо всех объединенных ячейках в листе;
      • setPreCalculateFormulas([$pCellStyle = true]) – данный метод необходимо использовать если требуется произвести расчет формул в листе (он имеется у двух классов: PHPExcel_Writer_Excel5 и PHPExcel_Writer_Excel2007). В рассматриваемый метод передается параметр типа boolean: true или false (если передать значение true, то расчет формул произойдет перед сохранением файла автоматически, иначе расчета формул не последует). Использование данного метода может оказаться полезным если созданный файл потребуется загрузить, к примеру на Google Drive. Ведь в таком случае расчет формул не будет произведен автоматически указанным сервисом и здесь вся ответственность ложиться на нас;
      • stringFromColumnIndex([$pColumnIndex = 0]) – данный метод позволяет определить по номеру столбца его символьное представление, для этого в качестве параметра необходимо передать его номер;
      • columnIndexFromString([$pString = 'A']) – с помощью данного метода можно определить номер столбца по его символьному представлению, для этого в качестве единственного параметра необходимо передать его обозначение.

      Примечание: Методы stringFromColumnIndex и columnIndexFromString примечательны тем, что их можно использовать без создания объекта класса. Пример использования представлен ниже:

      С помощью продемонстрированных возможностей, можно формировать и считывать любые отчеты в виде файлов, формата excel. А также были продемонстрированы почти все возможные методы для работы со стилями.

      Построение графиков на PHP возможно двумя способами. Можно нарисовать самостоятельно или использовать какую-нибудь библиотеку. Я предлагаю научиться создавать графики самим. Во-первых, потому что хорошие библиотеки являются платными. Во-вторых, используя любую библиотеку, вы ограничены её функционалом. Лучше рисовать графики самостоятельно.

      Для начала рассмотрим самый простой вариант. Есть массив, содержащий количество пользователей, которые зарегистрировались на сайте за 5 дней.

      Выведем этот массив на страницу в виде графика. Сначала нарисуем оси координат.

      3 - создаём изображение

      9-13 - засечки на оси x

      14-18 - цифры на оси x

      19, 20 - засечки на оси y

      21, 22 - цифры на оси y

      Рисунок должен выглядеть так:

      Оси графика PHP

      Чтобы нарисовать линию на графике, нужно найти на нём точки, по которым линия будет строиться. На практике можно сразу находить точку и рисовать по ней линию. Но чтобы пример был более понятным, мы разделим задачу на две части. Сначала найдём все точки, потом нарисуем по ним график. Для этого создадим двухмерный массив, в котором будут координаты x и y каждой точки. Для поиска координат нам нужна точка отсчёта. Это та точка, в которой пересекаются оси координат. В нашем рисунке она имеет координаты

      Для определения положения каждой точки нужно использовать масштаб графика. В примере мы задали масштаб сами. По оси x для каждого дня создано 100 пикселей. Первый день находится на расстоянии 100 пикселей от начала отсчёта, второй на расстоянии 200 пикселей и так далее. Значит координата x

      для первого дня: 50 + 100 = 150

      для второго: 50 + 200 = 250.

      По оси Y для каждых 10 пользователей выделено 100 пикселей. Значит для одного пользователя - 10 пикселей. Нужно учитывать, что у изображения ось Y направлена вниз, значит нужно не прибавлять значение к точке отсчёта, а вычитать. В первый день на сайте зарегистрировались 2 посетителя.

      Координата для этого значения равна: 250 - (2 * 10) = 230

      Для второго дня: 250 - (7 * 10) = 180

      Таким образом, массив с координатами точек получается такой:

      Теперь по ним построим график. Для этого запустим цикл, в котором будем рисовать линии по соседним точкам:

      График выглядит так:

      График

      Мы рассмотрели самый простой вариант построения графика. Я заранее знал количество дней и максимальное число пользователей. Поэтому я сам выбрал масштаб графика. Но обычно эти данные могут быть разными и масштаб нужно расчитывать. И сам график выглядит немного иначе. Нам привычно, что оси координат начинаются с нуля. Но для удобства отображения это правило иногда не соблюдается. Ось X начинается не с 0, а с 1, чтобы слева от линии не было пустого пространства. А ось Y показывается так, чтобы на график поместились все значения. Например, если минимальное значение: 60, а максимальное: 70, то ось Y содержит именно такой диапазон. Рассмотрим создание такого графика. Создадим для этого новый скрипт.

      В примере ось X имеет длину 520 пикселей. Её нужно разделить на одинаковые сегменты для каждого дня. Ось X начинаться не с 0, а с 1. Поэтому сегмента между 0 и 1 не будет и количество сегментов становится на 1 меньше. Если дней 5, то получится 4 сегмента. Формула расчёта такая:

      длина сегмента = длина оси / (число дней - 1)

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

      570 - 50 это длина оси X . Она зависит от размеров изображения.

      Ось Y делаем такой, чтобы поместились все значения. Нужно получить минимальное и максимальное значения. Они должны занять всю высоту графика. Зная диапазон, мы сможем рассчитать, сколько пикселей должно соответствовать одному пользователю на графике.

      диапазон = максимальное - минимальное

      длина сегмента = длина оси / диапазон

      Полученное число также нужно округлить.

      Сами оси рисуем, как в предыдущем примере:

      Поставим засечки и напишем числа:

      15 - цикл для каждого дня. Нулевого значения не будет

      17 - координата X для засечки. 50 - это точка отсчёта

      18 - для первого дня засечки не нужно, он находится в начале оси X

      19 - рисуем засечку

      20 - пишем цифру

      На оси Y не будем ставить засечки для каждого сегмента. Поставим на максимуме и в середине:

      22 - координата Y для засечки. 250 - это точка отсчёта. У изображений ось Y направлена вниз, поэтому не прибавляем к точке отсчёта, а вычитаем. При расчёте координаты Y всегда будем отнимать минимальное значение в массиве. Тогда график опуститься вниз, и минимальное значение на графике совпадёт с точкой отсчёта

      23 - рисуем засечку

      24 - число, которое нужно написать

      25 - пишем число

      Остальные цифры ставятся таким же способом.

      Строим график. Координаты точек, по которым будем рисовать линии, определяются так:

      x = точка отсчёта + номер дня * длина сегмента

      y = точка отсчёта - (количество пользователей - минимальное значение) * длина сегмента

      Графики на страницах с помощью PHP необходимы во многих случаях - для создания опросов и голосований, статистики. Иногда можно использовать Google Api для создания графиков, иногда PHP. Исходя из этого, мы рассмотрим сегодня примеры различных графиков на PHP и Javascript.

      Возможности классов pChart

      • множество геометрических фигур (круги, многоугольники, линии);
      • поддержка теней для фигур;
      • возможность использовать собственные ttf шрифты
      • возможность лёгкой установки и настройки;
      • рисование кривых;
      • создание полупрозрачного эффекта для фигур и линий;

      Пример простого графика нарисованного в php:

      Пример графика

      Для правильной работы класса создающиего риснуки графиков необходима следубщая структура директорий (скачать её можно в конце статьи):

      • index.php - текший страница;
      • class - директория с классами для рисования гарфиков;
      • fonts - шрифты, которые вы можете использовать в графиках;
      • цветовая схема графика;
      • директория в которую помещаяется кэш файл и изображение;

      Мы использовали функцию get_poll_pie_chart для того чтобы нарисовать круговую диаграмму. Вместо этой функции можно использовать следующие функции:

      • get_timeline_chart - линейный график с равномерным отображением линии;
      • get_poll_bar_chart - линейный график с динамическим отображением линии на графике;

      Пример графика, созданного функцией get_poll_bar_chart :

      Пример графика, созданного функцией get_poll_bar_chart:

      Пример графика, созданного функцией get_timeline_chart :

      Пример графика, созданного функцией get_timeline_chart:

      Некоторые графики на php вполне возможно объединить с графиками из Google Charts. Например, круговой график в Google Charts полностью соответствует круговой диаграмме отображённой ранее на странице:

      Пример использования графиков Google Charts

      Один из возможных вариантов использования графиков Google Charts создание индикатора загрузки файла:

      Для создания индикатора можно использовать следующий код:

      Если Вам не хватило инструментов для работы с графиками и диаграммами то можете использовать класс php "gChart" от Google. Все нижеуказанные диаграммы и графики созданы с использованием "gChart".

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

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

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


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

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

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

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

      <? 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.jpg) 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 >' ;
      if (isset( $new_stat [ $n ][ 0 ])) echo '<div style green">.
      floor ( 400 / $max * $new_stat [ $n ][ 0 ]). 'px;" title green">. $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>' ;

      Теперь давайте остановимся и рассмотрим подробнее некоторые моменты. Как Вы могли догадаться, $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.jpg - это сетка, которую мы нарисовали, чтобы украсить диаграмму и сделать ее более наглядной и читабельной. Т.к. в скрипте высота одного интервала по шкале Y равна 40 пикселям, то и на сетке интервалы между линиями тоже равны 40 пикселям.


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

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

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

      Читайте также: