我选择承担的部分学校编程项目需要根据用户数据使用 PHP 生成条形图。我的老师已经明确表示我不能使用开源课程或任何其他人的代码。他还禁止我使用 CSS 来显示图表,部分声称这是不可能的(我在网上看到过方法)。
我简要了解了一些流行的 PHP 图形类,例如 Jpchart 和 Pchart,它们看起来都相当复杂,有数万行代码。
当然,必须编写一个类来生成 jpeg 也必须相当复杂。
有没有人有任何建议,或者我应该放下脚告诉他这些期望是不现实的?
如果我们只是在谈论一个简单的条形图,他对 CSS 的看法是错误的,并且自 CSS 发明之日起就一直是错误的。<div>
使用几个标签和少量 CSS创建条形图是微不足道的。
他可能正在寻找他理解的特定解决方案——也许是一个 HTML 表格?(我真的希望不要)或者使用 PHP 中的 GD 库生成图像。
如果我是你,我会选择一个不寻常的解决方案,比如 SVG。在 SVG 中生成图表,并将其输出到浏览器。符合他的标准,但没有使用他的任何“禁止”选项。(但请注意 - 在选择此选项之前,请确保您的老师使用支持 SVG [即比 IE8 更新] 的浏览器!)
禁止你使用 CSS 对他来说是个彻头彻尾的举动。如果不使用 GDlib 函数 [我假设这不是练习的重点],您可以创建一个 1x2 单元格表并根据条形值设置单元格宽度,但如果没有CSS ,它会有点痛苦. 为避免引起 Dickbag 教授的愤怒,您将被困在为所有内容设置 HTML 属性。
您的讲师完全错误地认为 CSS 无法实现这一点。
如果他只是一个愤怒的老胡须,他可能想要这样的东西:
Tom: |**** | 43%
Dick: |*** | 27%
Harry: |******** | 82%
所以这就像回到 1981 年的一些 DEC PDP 一样。
由于您的讲师规定他需要图像形式的图形,因此您将需要使用GD 库函数。文档页面中的示例代码imagefilledrectangle()
应该足以让您入门:
<?php
// Create a 55x30 image
$im = imagecreatetruecolor(55, 30);
$white = imagecolorallocate($im, 255, 255, 255);
// Draw a white rectangle
imagefilledrectangle($im, 4, 4, 50, 25, $white);
// Save the image
imagepng($im, './imagefilledrectangle.png');
imagedestroy($im);
一旦您将其分解为基本任务,这很简单。回想一下你最初在学校是如何教你做图表的:
剩下的只是键和标题!
通过 html/css 绘制图表是完全可能的。
假设您制作了条形图。首先计算 min + max 并定义两者的高度。之后,取所有其他值并确定它们的高度(最小值/最大值的某个百分比)。在那之后,你在我心中有两个选择。1,将您的html呈现为带有单元格的表格,并在给定高度/宽度的情况下明确表示。或使用 id 和类渲染一堆 div,然后动态创建您的 css(与样式属性内联或仅将 css 动态写入脚本标签)并在您的 css 中根据您之前决定的设置高度。
这是使用 D3js 库的一些代码。这种方法非常合理,只需使用 php 而不是 js 以类似的方式编写代码。
如果您想查看其他示例:这里有一些html/css 图表示例。pcharts是一个很棒的库,它使用 GD php 扩展来生成 jpg/png 格式的图表图像。如果您计划即时生成图像,这个库应该会提供一些很好的灵感。
更新 我忍不住做了一个 php/css 示例:
<html>
<head>
<style type="text/css">
.bar {
background: #660000;
color: #fff;
height: 20px;
width: auto;
min-width: 2px;
clear: both;
margin-bottom: 5px;
padding: 5px;
font-weight: bold;
}
</style>
</head>
<body>
<?php
//array of values
$vals = array(
'git' => 9001,
'svn' => 4213,
'bitkeeper' => 7391,
'mercurial' => 2114,
'cvs' => 806,
);
//minimim and maximum
$min = 1;
$max = 200;
//calculate scale, draw, and loop
foreach ($vals as $key => $val) {
$scale = (2 * ($val-$min)/($max-$min))*8;
echo('<div class="bar" style="width: '.$scale.'px" title="'.$key.' = '.$val.'">'.$key."</div>");
}
?>
</body>
</html>