推荐:PHP购物车类因为需求中只记录产品的类型,还有编号..比如食物,,然后什么编号,,这样子.所以没有记录产品的数量..要用的自己改进一下就行了. ?php //setcookie(cart,s:26,45,4,4523423|d:17,7,27,26|e:12,13,123,43|f:34); //cartAdd('e','167'); //getProInfo('z'); /
原代码如下:
<?php
classImageReport
{
var$Image;//图片对像
var$ImageName;//报表名称
var$ImageType;//报表类型
var$ImageWidth;//图片宽
var$ImageHeight;//图片高
var$BgImage;//背景图片
var$BgR;//背景颜色R值
var$BgG;//背景颜色G值
var$BgB;//背景颜色B值
var$FontSize;//字体大小
var$FontColor;//字体颜色
var$ItemArray;//数据数组
var$ItemInterval;//两项间的间隔
var$XName;//x轴的名称
var$YName;//y轴的名称
var$isScale;//是否显示刻度值
var$margin;//边距
//字体
var$font='arial.ttf';
functionImageReport()
{
return;
}
//设置图片基本信息
functionsetImage($ImageName,$ImageType,$ImageWidth=500,$ImageHeight=400)
{
$this->ImageName =$ImageName;
$this->ImageType =$ImageType;
$this->ImageWidth =$ImageWidth;
$this->ImageHeight=$ImageHeight;
}
//设置坐标
functionsetItem($ItemArray,$ItemInterval="20",$XName="",$YName="",$isScale=true)
{
$this->ItemArray =$ItemArray;
$this->ItemInterval =$ItemInterval;
$this->XName =$XName;
$this->YName =$YName;
$this->isScale =$isScale;
}
//设置图片背景
functionsetBg($BgR="235",$BgG="255",$BgB="255",$BgImage="")
{
$this->BgR =$BgR;
$this->BgG =$BgG;
$this->BgB =$BgG;
$this->BgImage =$BgImage;
}
//设置字体
functionsetFont($FontSize)
{
$this->FontSize =$FontSize;
$this->margin =$FontSize*2+5;
//$this->FontColor =$FontColor;
}
//画主体
functiondrawReport()
{
//建立画布
$this->Image=imagecreatetruecolor($this->ImageWidth,$this->ImageHeight);
//填充背景色
$background=ImageColorAllocate($this->Image,$this->BgR,$this->BgG,$this->BgB);
//画背景颜色
ImageFilledRectangle($this->Image,0,0,$this->ImageWidth,$this->ImageHeight,$background);
//画背景图片
if(!empty($this->BgImage))
{
$this->drawLogo();
}
//跟距参数,画不同的图片
switch($this->ImageType)
{
case"1":
$this->drawColumn();
break;
case"2":
$this->drawCurve();
break;
case"3":
$this->drawCircle();
break;
default:
break;
}
}
//画柱状图
functiondrawColumn()
{
//调用画标题
$this->drawTitle();
//调用画坐标
$this->drawXY();
//获取数组的量
$num=count($this->ItemArray);
//获取数组中的最大值
//最大值
$max=$this->getArrayMax($this->ItemArray);
for($i=0;$i<count($this->ItemArray);$i++)
{
//随机颜色
srand((double)microtime()*1000000);
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
$color=ImageColorAllocate($this->Image,$R,$G,$B);
$yColor=ImageColorAllocate($this->Image,$R-10,$G-10,$B-10);
//柱体高度
$height=(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i]["value"])/$max;
//画柱体
ImageFilledRectangle($this->Image,$this->margin+$this->ItemInterval*(2*$i+1),$this->ImageHeight-$height+$this->FontSize-5-$this->margin,$this->margin+$this->ItemInterval*(2*$i+2),$this->ImageHeight-$this->margin,$color);
//画柱体上的阴影
imagefilledarc($this->Image,$this->margin+$this->ItemInterval*(2*$i+3/2),$this->ImageHeight-$height+$this->FontSize-5-$this->margin,$this->ItemInterval,$this->margin/2,0,360,$yColor,IMG_ARC_PIE);
//写柱体上面的数值
imagestring($this->Image,$this->FontSize,$this->margin+$this->ItemInterval*(2*$i+1),$this->ImageHeight-$height+$this->FontSize-5-$this->margin-$this->FontSize-10,$this->ItemArray[$i]["value"],$color);
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//写柱体的键值
imagettftext($this->Image,7,0,$this->margin+$this->ItemInterval*(2*$i+1)-3,$this->ImageHeight-$this->margin+$this->FontSize+2,$color,$this->font,$this->ItemArray[$i]["key"]);
}
//调用画LOGO
// $this->drawLogo();
}
//画曲线图
functiondrawCurve()
{
//调用画标题
$this->drawTitle();
//调用画坐标
$this->drawXY(true);
//最大值
$max=$this->getArrayMax($this->ItemArray);
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//背景刻度的颜色
$bgSColor=ImageColorAllocate($this->Image,$this->BgR-10,$this->BgG-10,$this->BgB-10);
//线条颜色
$linkColor=ImageColorAllocate($this->Image,51,51,153);
//画右X轴
ImageLine($this->Image,$this->margin,$this->margin+$this->FontSize+5,$this->ImageWidth-$this->margin,$this->margin+$this->FontSize+5,$color);
//画右Y轴
ImageLine($this->Image,$this->ImageWidth-$this->margin,$this->margin+$this->FontSize+5,$this->ImageWidth-$this->margin,$this->ImageHeight-$this->margin+2,$color);
$tdCount=count($this->ItemArray);
$tdWidth=($this->ImageWidth-$this->margin*2)/$tdCount;
for($i=0;$i<$tdCount-1;$i++)
{
//线条高度
$startHeight=(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i]["value"])/$max;
//结束线线条高度
$endHeight=(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i+1]["value"])/$max;
//画背景X轴刻度
ImageLine($this->Image,($i+1)*$tdWidth+$this->margin,$this->margin+$this->FontSize+6,($i+1)*$tdWidth+$this->margin,$this->ImageHeight-$this->margin,$bgSColor);
//画线条
ImageLine($this->Image,$i*$tdWidth+$this->margin,$this->ImageHeight-$startHeight+$this->FontSize-5-$this->margin,($i+1)*$tdWidth+$this->margin,$this->ImageHeight-$endHeight+$this->FontSize-5-$this->margin,$linkColor);
}
//画刻度的值
for($i=0;$i<$tdCount;$i++)
{
//显示值
//ImageString($this->Image,5,$i*$tdWidth+$this->margin,$this->ImageHeight-$this->margin+1,$this->ItemArray[$i]["key"],$color);
//画标题的字
imagettftext($this->Image,7,0,$i*$tdWidth+$this->margin,$this->ImageHeight-$this->margin+1+10,$color,$this->font,$this->ItemArray[$i]["key"]);
}
}
//画饼图
functiondrawCircle()
{
//一个扇区的角度
$degree=0;
//开始的角度
$e=0;
//用于保存颜色的数组
$colorArray;
//用于保存开始角度的数组
$startDegree;
//用于保存结束角度的数组
$endDegree;
//扇形的宽
$width=($this->ImageWidth-$this->margin*2)-200;
//获取数组的量
$num=count($this->ItemArray);
//调用画标题
$this->drawTitle();
//各项之和
$total=0;
//计算各项之和
for($i=0;$i<$num;$i++)
{
$total+=$this->ItemArray[$i]["value"];
}
//保扇区的各项值保存到数组
for($i=0;$i<count($this->ItemArray);$i++)
{
//随机颜色
srand((double)microtime()*1000000);
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
//把颜色保存进数组
$colorArray[$i]["R"]=$R;
$colorArray[$i]["G"]=$G;
$colorArray[$i]["B"]=$B;
//计算一个区块的角度
//echo $this->ItemArray[$i]["value"];
//exit;
$degree=$this->ItemArray[$i]["value"]/$total*360;
$startDegree[$i]=$e;
$endDegree[$i]=$e+$degree;
$e+=$degree;
}
$j=$width/4+$this->margin+35;
$mJ=$j-15;
//画阴影
for($j;$j>$mJ;$j--)
{
for($i=0;$i<$num;$i++)
{
$color=ImageColorAllocate($this->Image,$colorArray[$i]["R"]-10,$colorArray[$i]["G"]-10,$colorArray[$i]["B"]-10);
imagefilledarc($this->Image,$width/2+$this->margin,$j,$width,$width/2,$startDegree[$i],$endDegree[$i],$color,IMG_ARC_PIE);
}
}
//画区面和右边的标识字
for($i=0;$i<$num;$i++)
{
//获取颜色
$color=ImageColorAllocate($this->Image,$colorArray[$i]["R"],$colorArray[$i]["G"],$colorArray[$i]["B"]);
//画区面
imagefilledarc($this->Image,$width/2+$this->margin,$width/4+$this->margin+20,$width,$width/2,$startDegree[$i],$endDegree[$i],$color,IMG_ARC_PIE);
//说明方块的上边距
$top=$this->margin+20+$i*10;
//画右边的距形
ImageFilledRectangle($this->Image,$width+$this->margin+20,$top+($i*10),$width+$this->margin+30,$top+($i*10)+10,$color);
//字体颜色为黑色
$fontColor=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//画右边的说明文字
$rightStr=$this->ItemArray[$i]["key"].":".$this->ItemArray[$i]["value"]."(".round($this->ItemArray[$i]["value"]*100/$total,2)."%)";
//ImageString($this->Image,10,$width+$this->margin+35,$top+($i*10)-3,$rightStr,$fontColor);
imagettftext($this->Image,9,0,$width+$this->margin+35,$top+($i*10)+8,$fontColor,$this->font,$rightStr);
}
//清空各数组
unset($colorArray,$startDegree,$endDegree);
}
//显示图片
functionshowImage($ImageSavePath="")
{
// echo $ImageSavePath;
//exit;
if(empty($ImageSavePath))
{
ImagePNG($this->Image);
}
else
{
ImagePNG($this->Image,$ImageSavePath);
}
ImageDestroy($this->Image);
}
//画标题
functiondrawTitle()
{
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//阴影色
$black=imagecolorallocate($this->Image,0,0,0);
//计算标题字体的宽度
$fontWidth=strlen($this->ImageName)*($this->FontSize)-strlen($this->ImageName)*2;
//画标题字的阴影
imagettftext($this->Image,$this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2+1,$this->FontSize+11,$black,$this->font,$this->ImageName);
//画标题的字
imagettftext($this->Image,$this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2,$this->FontSize+10,$color,$this->font,$this->ImageName);
//画标题下面的线条
imageline($this->Image,$this->ImageWidth/2-$fontWidth/2-20,$this->FontSize+12,$this->ImageWidth/2-$fontWidth/2+1+$fontWidth+20,$this->FontSize+12,$color);
}
//画LOGO
functiondrawLogo()
{
list($w,$h,$type)=getimagesize($this->BgImage);
$source;
switch($type)
{
//图片是GIF
case1:
$source=imagecreatefromgif($this->BgImage);
break;
//图片是jPG
case2:
$source=imagecreatefromjpeg($this->BgImage);
break;
//图片是PNG
case3:
$source=imagecreatefrompng($this->BgImage);
}
imagecopymerge($this->Image,$source,0,0,0,0,$w,$h,20);
}
//画坐标
functiondrawXY($bgScale=false)
{
//最大值
$max=$this->getArrayMax($this->ItemArray);
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//背景刻度的颜色
$bgSColor=ImageColorAllocate($this->Image,$this->BgR-10,$this->BgG-10,$this->BgB-10);
//画X轴
ImageLine($this->Image,$this->margin,$this->ImageHeight-$this->margin+2,$this->ImageWidth-$this->margin,$this->ImageHeight-$this->margin+2,$color);
//画Y轴
ImageLine($this->Image,$this->margin,$this->margin+$this->FontSize+5,$this->margin,$this->ImageHeight-$this->margin+2,$color);
//阴影色
$black=imagecolorallocate($this->Image,0,0,0);
//画Y轴字的阴影
imagettftext($this->Image,$this->FontSize,90,$this->FontSize+2,intval($this->ImageHeight/2)-1,$black,$this->font,$this->YName);
//画Y轴的字
imagettftext($this->Image,$this->FontSize,90,$this->FontSize+2,intval($this->ImageHeight/2),$color,$this->font,$this->YName);
//画X轴字的阴影
imagettftext($this->Image,$this->FontSize,0,intval($this->ImageWidth/2)-1,$this->ImageHeight-$this->FontSize+5,$black,$this->font,$this->XName);
//画X轴的字
imagettftext($this->Image,$this->FontSize,0,intval($this->ImageWidth/2),$this->ImageHeight-$this->FontSize+5,$color,$this->font,$this->XName);
//画0点坐标
imagettftext($this->Image,8,90,$this->margin/2+$this->FontSize,$this->ImageHeight-$this->margin,$color,$this->font,"0");
//画最大值数据
// imagettftext($this->Image, $this->FontSize,90,$this->margin/2+7,$this->margin+20,$black,$font,$max);
//画内容的实际高度
$height=$this->ImageHeight-$this->margin*2-($this->FontSize+5);
//每一刻度的值
$scale=intval($height/10);
for($i=0;$i<10;$i++)
{
//画刻度,如果设置了背景刻度
if($bgScale)
{
ImageLine($this->Image,$this->margin+1,$this->margin+$i*$scale+$this->FontSize+5+$i,$this->ImageWidth-$this->margin,$this->margin+$i*$scale+$this->FontSize+5+$i,$bgSColor);
}
else
{
ImageLine($this->Image,$this->margin-2,$this->margin+$i*$scale+$this->FontSize+5+$i,$this->margin,$this->margin+$i*$scale+$this->FontSize+5+$i,$color);
}
//画刻度上的值
if($this->isScale)
{
$num=round($max-$max/10*$i,1);
imagettftext($this->Image,7,90,$this->margin/2+$this->FontSize,$this->margin+$i*$scale+15+$this->FontSize,$color,$this->font,$num);
}
}
//如果未画刻度值,则画最大值
if(!$this->isScale)
{
imagettftext($this->Image,7,90,$this->margin/2+$this->FontSize,$this->margin+15+$this->FontSize,$color,$this->font,$max);
}
}
//获取数组中的最大值
functiongetArrayMax($Array)
{
$temp=0;
for($i=0;$i<count($Array);$i++)
{
if($temp<$Array[$i]["value"])
{
$temp=$Array[$i]["value"];
}
}
return$temp;
}
?>
调用方法
require_once ("ImageReport.inc.php");
$report=new ImageReport;
$report->setImage($title,$type,$imgW,$imgH);//参数(标题,类型(1(柱图),2(曲线图),3(饼图)),图片宽,图片高)
//这个我用数据库查出来的,要改一下.格式是多维数据.key=>value
$temparray=$this->db->GetArray("select report_key as 'key',report_value as value from cms_r_report_data where report_id=$id order by report_dataId ASC");
$report->setItem($temparray,$interval,$XName,$YName,$isScale);//参数(数组,间隔,X轴文字,Y轴文字,背景图片)
$report->setBg($BgR,$BgG,$BgB,"logo.jpg");//参数(背景颜色)
$report->setFont(10);//字体大小1-10
$report->drawReport();
$report->showImage("../images/report/".$id.".png");//参数为保存的路径
分享:怎样得到一个字符串的最后一个字符PHP技巧:得到一个字符串的最后一个字符 ?php 得到PHP中最后一个字符 str = www.dwww.cn ; var = trim(str); len = strlen(var)-1; echo var{len}; ?
- 相关链接:
-
教程说明:
PHP教程-php如何实现报表类
。