Когда вам надо на своей страничке представить данные в виде столбиковой диаграммы, то часто оказывается удобней сгенерировать результат графически. В примере листинга представлена функция, которая создает столбиковую диаграмму данных, используя только аппарат CSS и XHTML.
Мы хотим написать сценарий, который будет получать массив значений и наносить их на рисунок в виде линий толщиной 1 пиксель для каждого значения. При этом чтобы получить нужный эффект, мы будем использовать выражение div, для абсолютного позиционирования, а высоту будем задавать с помощью CSS. Расположить полученную диаграмму на странице можно так, как требуется для реализации дизайна, задав максимальное значение высоты, которое будет определять относительное изменение каждого отдельного значения.
1-я диаграмма:

2-я диаграмма:

Обе:

Мы хотим написать сценарий, который будет получать массив значений и наносить их на рисунок в виде линий толщиной 1 пиксель для каждого значения. При этом чтобы получить нужный эффект, мы будем использовать выражение div, для абсолютного позиционирования, а высоту будем задавать с помощью CSS. Расположить полученную диаграмму на странице можно так, как требуется для реализации дизайна, задав максимальное значение высоты, которое будет определять относительное изменение каждого отдельного значения.
<?php //Определим функцию, создающую столбики. //Кроме непосредственно самих данных, нам понадобится знать максимальное значение высоты столбиков. //Ну, и, конечно, передаем 4 параметра, определяющих цвета границы, фона, столбиков и сетки, но все //они не обязательны. function create_chart($data, $height, $bars='red', $bg='white', $border='black', $grid='#ddd') { //Прежде всего давайте убедимся, что каждый раз при вызове нашей функции мы генерируем новый //числовой индекс для данной диаграммы, это может понадобиться, если необходимо создать несколько //диаграмм на одной странице: static $idx = 0; $idx++; //Значение высоты должно быть уменьшено на 2 пикселя, чтобы оставить место для линии границы: $height -= 2; //Теперь определим коэффициент уменьшения высоты столбиков, поскольку для удобства визуализации //лучше, чтобы график не пересекал верхнюю границу. $scale = $height / (max($data) * 1.05); //Вычислим ширину $width = count($data); //Теперь можно создать несколько базовых стилей CSS, которые будут использованы для изображения //графика: echo" <style> #chartout{$idx}{ position: relative; height: ",$height + 2,"px; width: ",$width + 2,"px; background-color: {$border}; } #chartin{$idx}{ position: absolute; top: 1px; left: 1px; height: {$height}px; width: {$width}px; background-color: {$bg}; } .bar{$idx}{ position: absolute; bottom: 0; background-color: {$bars}; width: 1px; overflow: hidden; } .grid{$idx}{ position: absolute; left: 0; height: 1px; width: {$width}px; background-color: {$grid}; padding: 0; margin: 0; overflow: hidden; } </style> "; //Теперь выводим основную часть диаграммы: echo"<div id='chartout{$idx}'><div id='chartin{$idx}'>"; //Создадим шаблон сетки, который будет делить все пространство диаграммы на пять частей: foreach(range(1,3) as $line) { $lh = round($line * ($height/5)); echo "<div class='grid{$idx}' style='top: {$lh}px'></div>\n"; } //Теперь организуем цикл, перебирающий все элементы массива и рисующий отдельные столбики //нашей диаграммы: foreach($data as $pos => $val) { $barheight = round($val * $scale); echo "<div class='bar{$idx}' style='left: {$pos}px; height: {$barheight}px;'></div>\n"; } //Завершение echo "\n</div></div>\n"; } //Сгенерируем случайным образом 200 точек данных в двух разных массивах. $chardata = array(); $chardata2 = array(); for ($i=0; $i<200; $i++) { $chardata[$i] = rand(1,1000); $chardata2[$i] = rand(1,1000); } //Теперь генерируем столбиковую диаграмму, высотой 100 пикселей: create_char($chardata,100); //И еще одну диаграмму высотой 50 пикселей, с другими цветами: create_char($chardata2,50,"#0c0","black","black","#666"); ?>
1-я диаграмма:

2-я диаграмма:

Обе:


