正文
php生成数据结构图 php生成数据结构图
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
php怎么生成缩略图
给你个函数吧
// *****生成缩略图*****
// 只考虑jpg,png,gif格式
// $srcImgPath 源图象路径
// $targetImgPath 目标图象路径
// $targetW 目标图象宽度
// $targetH 目标图象高度
function makeThumbnail($srcImgPath,$targetImgPath,$targetW,$targetH)
{
$imgSize = GetImageSize($srcImgPath);
$imgType = $imgSize[2];
//@ 使函数不向页面输出错误信息
switch ($imgType)
{
case 1:
$srcImg = @ImageCreateFromGIF($srcImgPath);
break;
case 2:
$srcImg = @ImageCreateFromJpeg($srcImgPath);
break;
case 3:
$srcImg = @ImageCreateFromPNG($srcImgPath);
break;
}
//取源图象的宽高
$srcW = ImageSX($srcImg);
$srcH = ImageSY($srcImg);
if($srcW$targetW || $srcH$targetH)
{
$targetX = 0;
$targetY = 0;
if ($srcW $srcH)
{
$finaW=$targetW;
$finalH=round($srcH*$finaW/$srcW);
$targetY=floor(($targetH-$finalH)/2);
}
else
{
$finalH=$targetH;
$finaW=round($srcW*$finalH/$srcH);
$targetX=floor(($targetW-$finaW)/2);
}
//function_exists 检查函数是否已定义
//ImageCreateTrueColor 本函数需要GD2.0.1或更高版本
if(function_exists("ImageCreateTrueColor"))
{
$targetImg=ImageCreateTrueColor($targetW,$targetH);
}
else
{
$targetImg=ImageCreate($targetW,$targetH);
}
$targetX=($targetX0)?0:$targetX;
$targetY=($targetX0)?0:$targetY;
$targetX=($targetX($targetW/2))?floor($targetW/2):$targetX;
$targetY=($targetY($targetH/2))?floor($targetH/2):$targetY;
//背景白色
$white = ImageColorAllocate($targetImg, 255,255,255);
ImageFilledRectangle($targetImg,0,0,$targetW,$targetH,$white);
/*
PHP的GD扩展提供了两个函数来缩放图象:
ImageCopyResized 在所有GD版本中有效,其缩放图象的算法比较粗糙,可能会导致图象边缘的锯齿。
ImageCopyResampled 需要GD2.0.1或更高版本,其像素插值算法得到的图象边缘比较平滑,
该函数的速度比ImageCopyResized慢。
*/
if(function_exists("ImageCopyResampled"))
{
ImageCopyResampled($targetImg,$srcImg,$targetX,$targetY,0,0,$finaW,$finalH,$srcW,$srcH);
}
else
{
ImageCopyResized($targetImg,$srcImg,$targetX,$targetY,0,0,$finaW,$finalH,$srcW,$srcH);
}
switch ($imgType) {
case 1:
ImageGIF($targetImg,$targetImgPath);
break;
case 2:
ImageJpeg($targetImg,$targetImgPath);
break;
case 3:
ImagePNG($targetImg,$targetImgPath);
break;
}
ImageDestroy($srcImg);
ImageDestroy($targetImg);
}
else //不超出指定宽高则直接复制
{
copy($srcImgPath,$targetImgPath);
ImageDestroy($srcImg);
}
}
代码已经测试,成功运行!
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
队列这种数据结构更简单,就像我们生活中排队一样,它的特性是先进先出(FIFO)。
PHP
SPL中SplQueue类就是实现队列操作,和栈一样,它也可以继承双链表(SplDoublyLinkedList)轻松实现。
SplQueue类摘要如下:
SplQueue简单使用如下:
复制代码
代码如下:
$queue
=
new
SplQueue();
/**
*
可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
*
(1)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_KEEP
(默认值,迭代后数据保存)
*
(2)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE
(迭代后数据删除)
*/
$queue-setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE);
//SplQueue::enqueue()其实就是
SplDoublyLinkedList::push()
$queue-enqueue('a');
$queue-enqueue('b');
$queue-enqueue('c');
//SplQueue::dequeue()其实就是
SplDoublyLinkedList::shift()
print_r($queue-dequeue());
foreach($queue
as
$item)
{
echo
$item
.
PHP_EOL;
}
print_r($queue);
而优先队列SplPriorityQueue是基于堆(后文介绍)实现的。
SplPriorityQueue的类摘要如下:
SplPriorityQueue简单使用:
$pq
=
new
SplPriorityQueue();
$pq-insert('a',
10);
$pq-insert('b',
1);
$pq-insert('c',
8);
echo
$pq-count()
.PHP_EOL;
//3
echo
$pq-current()
.
PHP_EOL;
//a
/**
*
设置元素出队模式
*
SplPriorityQueue::EXTR_DATA
仅提取值
*
SplPriorityQueue::EXTR_PRIORITY
仅提取优先级
*
SplPriorityQueue::EXTR_BOTH
提取数组包含值和优先级
*/
$pq-setExtractFlags(SplPriorityQueue::EXTR_DATA);
while($pq-valid())
{
print_r($pq-current());
//a
c
b
$pq-next();
}
如何使用php实现一个双向队列的数据结构有几种方式
不建议直接用php来做队列,php的array操作虽然勉强能做伪队列,但问题也来了,如果是大量的数据呢php生成数据结构图?php会不会内存问题直接挂了php生成数据结构图?
建议:测试的话用用还凑合,但真正去用的话双向队列,用redis的list类型吧,可以满足php生成数据结构图你的需求,同时数量级上也不是问题,单向队列
httpsqs,rabbitmq等
再看看别人怎么说的。
php 数据库中输出的数据结构
从数据库读出来php生成数据结构图的原始数据是资源。还不是数组。
$result = mysql_Query("select * from tb_admin where parid=1")
while($list = mysql_fetch_array($result)){
print_r($list);//这里输出php生成数据结构图的数组是将原数组拆开来输出。
}
原始的数据结构应是:
array(
[0]=array(
[id]=01
[classname]=我是
[url]=baidu.com
)
[1]=array(
//这里同上php生成数据结构图,不两累赘
)
)
数据结构实现图的基本操作
对邻接表存储的图进行深度优先搜索算法:
#include "stdio.h"
#define MAXVER 10 /* 最多顶点数 */
typedef char ElemType; /* 顶点元素类型 */
typedef struct node
{ int num;
struct node *next;
}slink; /* 边或弧的结点类型 */
typedef struct
{ struct
{ ElemType vertex;
slink *first;
}ve[MAXVER]; /* 顶点信息结构 */
int vex,edge,tag; /* 存放顶点数、边数和图的类型 */
}adjlist; /* 邻接表存储结构类型名 */
/* 建立图的邻接表存储表示。 */
void cregraph(adjlist *G,int n,int m) /* 建立邻接表. n为顶点数,m为图的类型 */
{ int i,e=0;slink *p,*q,*s;char x,y;
G-vex=n; G-tag=m;
for(i=0;in;i++)
{ G-ve[i].vertex=i+'A'; G-ve[i].first=NULL;} /* 初始化邻接表 */
printf("Input edges(x--y):"); /* 用大写字母表示顶点 */
scanf("%c%c",x,y);
while(x!=' 'y!=' ') /* 输入边或弧,遇空格符结束 */
{ e++; /* 统计边或弧和数目 */
s=(slink *)malloc(sizeof(slink));
s-num=y-'A'; /* 生成结点插入 */
if(G-ve[x-'A'].first==NULL)
{ G-ve[x-'A'].first=s;
s-next=NULL;
}
else
{ p=G-ve[x-'A'].first;q=p-next;
while(q!=NULLs-numq-num) {p=q;q=q-next;}
p-next=s;s-next=q;
}
if(!G-tag) /* m=0表示建立无向图的邻接表 */
{ s=(slink *)malloc(sizeof(slink));
s-num=x-'A';
if(G-ve[y-'A'].first==NULL)
{ G-ve[y-'A'].first=s;s-next=NULL;}
else
{ p=G-ve[y-'A'].first;q=p-next;
while(q!=NULLs-numq-num) { p=q;q=q-next;}
p-next=s;s-next=q;
}
}
scanf("%c%c",x,y);
}
G-edge=e;
}
/* 输出用邻接表存储表示的图 */
void list(adjlist *G) /* 输出邻接表 */
{ int i; slink *p;
for(i=0;iG-vex;i++)
{ printf("%d:%c---",i,G-ve[i].vertex);
p=G-ve[i].first;
while(p)
{ printf("%3d",p-num);
p=p-next;
}
printf("\n");
}
}
/* 对邻接表存储的图进行深度优先搜索算法 */
int visited[MAXVER+1]; /* 顶点的访问标记数组 */
dfs(adjlist *G,int v) /* v是访问的起始点的下标 */
{ slink *p;
visited[v]=1;
printf("%3c",G-ve[v].vertex);
p=G-ve[v].first;
while(p)
{ if(visited[p-num]==0) /* 从V的未访问过的邻接点出发 */
dfs(G,p-num);
p=p-next; /* 找V的下一个邻接点 */
}
}
void dfsgraph(adjlist *G)
{ int i;
for(i=0;iG-vex;i++) if(!visited[i]) dfs(G,i);
}
main()
{ adjlist g;
int n=8;
cregraph(g,n,0);
dfsgraph(g);
}
对一个采用邻接表作存储结构的图进行广度优先遍历:
/*邻接表结构*/
#include "stdio.h"
#define MAXVER 10 /* 最多顶点数 */
typedef char ElemType; /* 顶点元素类型 */
typedef struct node
{ int num;
struct node *next;
}slink; /* 边或弧的结点类型 */
typedef struct
{ struct
{ ElemType vertex;
slink *first;
}ve[MAXVER]; /* 顶点信息结构 */
int vex,edge,tag; /* 存放顶点数、边数和图的类型 */
}adjlist; /* 邻接表存储结构类型名 */
/*建立邻接表*/
void cregraph(adjlist *G,int n,int m) /* n为顶点数,m为图的类型 */
{ int i,e=0;slink *p,*q,*s;char x,y;
G-vex=n; G-tag=m;
for(i=0;in;i++)
{ G-ve[i].vertex=i+'A'; G-ve[i].first=NULL;} /* 初始化邻接表 */
printf("Input edges(x--y):"); /* 用大写字母表示顶点 */
scanf("%c%c",x,y);
while(x!=' 'y!=' ') /* 输入边或弧,遇空格符结束 */
{ e++; /* 统计边或弧和数目 */
s=(slink *)malloc(sizeof(slink));
s-num=y-'A'; /* 生成结点插入 */
if(G-ve[x-'A'].first==NULL)
{ G-ve[x-'A'].first=s;
s-next=NULL;
}
else
{ p=G-ve[x-'A'].first;q=p-next;
while(q!=NULLs-numq-num) {p=q;q=q-next;}
p-next=s;s-next=q;
}
if(!G-tag) /* m=0表示建立无向图的邻接表 */
{ s=(slink *)malloc(sizeof(slink));
s-num=x-'A';
if(G-ve[y-'A'].first==NULL)
{ G-ve[y-'A'].first=s;s-next=NULL;}
else
{ p=G-ve[y-'A'].first;q=p-next;
while(q!=NULLs-numq-num) { p=q;q=q-next;}
p-next=s;s-next=q;
}
}
scanf("%c%c",x,y);
}
G-edge=e;
}
/* 输出邻接表 */
void list(adjlist *G) /* 输出用邻接表表示的图 */
{ int i; slink *p;
for(i=0;iG-vex;i++)
{ printf("%d:%c---",i,G-ve[i].vertex);
p=G-ve[i].first;
while(p)
{ printf("%3d",p-num);
p=p-next;
}
printf("\n");
}
}
/* 对一个采用邻接表作存储结构的图进行广度优先遍历 */
int visited[MAXVER];
void bfs(adjlist *G,int v)
{ int queue[MAXVER],front,rear,i;/* 定义一个分离队列 */
slink *p;
front=rear=0; /* 队列初始化为空 */
queue[rear++]=v; /* 初始顶点入队列 */
while(front!=rear) /* 队列不空 */
{ v=queue[front++]; /* 出队列访问 */
printf("%c-",G-ve[v].vertex);
visited[v]=1; /* 入访问表 */
p=G-ve[v].first;
while(p!=NULL)
{ for(i=0;irear;i++)
if(p-num==queue[i]) break;
if(i=rear)
queue[rear++]=p-num; /* 该邻接点即没被访问过,也不在队列中,则入队列 */
p=p-next; /* 找V的下一个邻接点 */
}
}
}
void bfsgraph(adjlist *G) /* 若还有不连通的部分,则跳过去访问之 */
{ int i;
for(i=0;iG-vex;i++)
if(!visited[i]) bfs(G,i);
}
main()
{ adjlist G;
cregraph(G,8,0);
bfsgraph(G);
}
最小生成树的算法:
/*求最小生成树的Kruskal算法描述*/
#define MAXE 10
struct edges
{ int bv,tv,w;}; /* 边集类型,存储一条边的起始点bv终止顶点tv和权w */
typedef struct edges edgeset[MAXE+1];
int seeks(int set[],int v)
{ int i=v;
while(set[i]0)
i=set[i];
return i;
}
kruskal(edgeset ge,int n,int e) /* ge表示的图是按权值从小到大排列的 */
{ int set[MAXE],v1,v2,i,j;
for(i=1;i=n;i++)
set[i]=0; /* 给set中的每个元素赋初值 */
i=1; /* i表示待获取的生成树中的边数,初值为1 */
j=1; /* j表示ge中的下标,初值为1 */
while(jn i=e) /* 按边权递增顺序,逐边检查该边是否应加入到生成树中 */
{ v1=seeks(set,ge[i].bv); /* 确定顶点v所在的边通集 */
v2=seeks(set,ge[i].tv);
if(v1!=v2) /* 当v1,v2不在同一顶点集合,确定该边应当选入生成树 */
{ printf(" (%d,%d) ",ge[i].bv,ge[i].tv);
set[v1]=v2;
j++;
}
i++;
}
}
main()
{ edgeset e={{0,0,0},{4,5,2},{3,5,3},{1,4,5},{1,2,6},{2,4,7},{2,5,8},{1,3,9},{3,4,9},{1,5,13},{2,3,14}};
kruskal(e,5,10);
}
最短路径的算法:
#define Max 10 /* 预设最多顶点数 */
#define INFINITY 1000 /* 最大值 */
typedef struct
{ int vexnum,arcnum; /* 顶点数及边或弧的数目 */
char vex[Max]; /* 存顶点信息的一维数组 */
int arc[Max][Max]; /* 存边信息的二维数组 */
}AdjMatrix;
/* 建立有向图的邻接矩阵表示 */
void Creadjm(AdjMatrix *G)
{ int i,j,k,w;
printf("Input vexarc:");
scanf("%d%d%*c",G-vexnum,G-arcnum);/*输入顶点数和边数,并读掉回车符*/
printf("Input Vexinfo:");
for(k=0;kG-vexnum;k++)
scanf("%c",G-vex[k]); /* 输入代表顶点的字符 */
for(i=0;iG-vexnum;i++)
for(j=0;jG-vexnum;j++)
G-arc[i][j]=INFINITY; /* 初始化邻接矩阵 */
printf("Input %d edges:\n",G-arcnum);
for(k=0;kG-arcnum;k++)
{ scanf("%d%d%d",i,j,w); /* 输入边或弧 */
G-arc[i][j]=w;
}
}
/* 输出用邻接矩阵表示的有向图 */
void list(AdjMatrix *G)
{ int i,j;
for(i=0;iG-vexnum;i++)
{ printf("%6c----",G-vex[i]); /* 先输出顶点信息 */
for(j=0;jG-vexnum;j++)
printf("%4d",G-arc[i][j]); /* 再输出与该顶点有关联的边或弧的信息 */
printf("\n");
}
}
/* 计算从顶点v0到其余各点最短路径算法 */
void dijkstra(AdjMatrix *G,int n,int v0,int d[]) /* d数组存放各顶点最短路径 */
{ int s[Max] ; /* s数组存放顶点是否找到最短路径 */
int i,j,u,mindis;
for(i=0;in;i++)
{ d[i]=G-arc[v0][i];s[i]=0;}
s[v0]=1;
for(i=1;in;i++)
{ mindis=INFINITY;
for(j=0;jn;j++)
if(s[j]==0 d[j]mindis) { u=j; mindis=d[j];}
s[u]=1; /* 顶点u已找到最短路径 */
for(j=1;j=n;j++) /* 修改j的最短路径 */
if(s[j]==0d[j]d[u]+G-arc[u][j]) d[j]=d[u]+G-arc[u][j];
}
}
main()
{ AdjMatrix G;
int d[Max],i;
Creadjm(G);
list(G);
dijkstra(G,6,0,d);
for(i=0;iG.vexnum;i++)
printf("%4d",d[i]);
}
PHP做图标,pChart怎么用啊?图在哪里输出?
pChart是一个开源的图表生成库,主要涉及3个Class: pChart.class , pData.class , pCache.class ,可生成20多种简单或复杂的图表,支持PNG,JPG,GIF通用图片格式。数据源可以来自于Database,CSV,当然也可以手写。使用该程序PHP需要开启GD服务,先来看看p
pChart是一个开源的图表生成库,主要涉及3个Class:, , ,可生成20多种简单或复杂的图表,支持PNG,JPG,GIF通用图片格式。数据源可以来自于Database,CSV,当然也可以手写。使用该程序PHP需要开启GD服务,先来看看pChart的工作流程:

主要分为三步:
* 读取用于生成图表数据(数据库、文件)
* 设计图表样式(圆角、底色等)
* 制作标签、题目、图例并生成图表
下面看一个简单的柱状图表:

代码如下:
?php // Standard inclusionsinclude("pChart/pData.class");
include("pChart/pChart.class");
// Dataset definition $DataSet = newpData;
//图表数据 $DataSet-AddPoint(array(1,4,-3,2,-3,3,2,1,0,7,4),"Serie1");
$DataSet-AddPoint(array(3,3,-4,1,-2,2,1,0,-1,6,3),"Serie2");
$DataSet-AddPoint(array(4,1,2,-1,-4,-2,3,2,1,2,2),"Serie3");
$DataSet-AddAllSeries();
$DataSet-SetAbsciseLabelSerie();
//数据图例 $DataSet-SetSerieName("Microsoft","Serie1");
$DataSet-SetSerieName("IBM","Serie2");
$DataSet-SetSerieName("Google","Serie3");
// Initialise the graph $Test = newpChart(700,230);
//设置图表尺寸、样式 $Test-setFontProperties("Fonts/tahoma.ttf",8);
$Test-setGraphArea(50,30,680,200);
$Test-drawFilledRoundedRectangle(7,7,693,223,5,240,240,240);
$Test-drawRoundedRectangle(5,5,695,225,5,230,230,230);
$Test-drawGraphArea(255,255,255,TRUE);
$Test-drawScale($DataSet-GetData(),$DataSet-GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2,TRUE);
$Test-drawGrid(4,TRUE,230,230,230,50);
// Draw the 0 line $Test-setFontProperties("Fonts/MankSans.ttf",6);
$Test-drawTreshold(0,143,55,72,TRUE,TRUE);
// Draw the bar graph //柱状图要使用drawBarGraph() $Test-drawBarGraph($DataSet-GetData(),$DataSet-GetDataDescription(),TRUE,80);
// Finish the graph //制作图例、标题、字体等属性 $Test-setFontProperties("Fonts/MankSans.ttf",10);
$Test-drawLegend(596,150,$DataSet-GetDataDescription(),255,255,255);
$Test-setFontProperties("Fonts/MankSans.ttf",10);
$Test-drawTitle(50,22,"Example",50,50,50,585);
//生成图表 $imageFile ="example12.png";
$Test-Render($imageFile);
echo 'img src="'.$imageFile.'"'
php生成数据结构图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php生成数据结构图、php生成数据结构图的信息别忘了在本站进行查找喔。