PHP Array交叉表实现代码


Posted in PHP onAugust 05, 2010

如果使用sql语句做的话 工作量太大了,于是尝试自己写一个交叉表的类,好二话不说,我们看看代码

/** 
* 基本交叉表 
* @author hugh 
* 
*/ 
class Pivot 
{ 
private $HORIZONTAL_TOTAL_FIELD = 'total'; 
private $VERTICAL_TOTAL_FIELD = 'total'; 
private $data; 
private $topPivot; 
private $leftPivot; 
private $measure; 
private $horizontalColumn = array (); 
private $verticalColumn = array (); 
private $pivotValue = array (); 
private $isHorizontalTotal = true; 
private $isVerticalTotal = true; 
private $horizontalTotal = null; 
private $verticalTotal = null; 
private $title = 'PivotTab'; 
/** 
* 初始化交叉表 
*/ 
private function InitPivot() 
{ 
$this->topPivot; 
foreach ( $this->data as $d ) 
{ 
$this->horizontalColumn [] = $d [$this->leftPivot]; 
$this->verticalColumn [] = $d [$this->topPivot]; 
} 
$this->horizontalColumn = array_unique ( $this->horizontalColumn ); 
$this->verticalColumn = array_unique ( $this->verticalColumn ); 
$reasult = array (); 
foreach ( $this->horizontalColumn as $h ) 
{ 
foreach ( $this->verticalColumn as $v ) 
{ 
$this->pivotValue [$h] [$v] = 0; 
} 
} 
} 
/** 
* 填充数据 
*/ 
private function fillData() 
{ 
foreach ( $this->data as $row ) 
{ 
$this->pivotValue [$row [$this->leftPivot]] [$row [$this->topPivot]] += $row [$this->measure]; 
} 
if ($this->isHorizontalTotal) 
{ 
$this->setHorizontalTotal (); 
} 
if ($this->isVerticalTotal) 
{ 
$this->setVerticalTotal (); 
} 
} 
/** 
* 设置纵向合计 
*/ 
private function setVerticalTotal() 
{ 
$this->verticalColumn [] = $this->VERTICAL_TOTAL_FIELD; 
foreach ( $this->horizontalColumn as $i ) 
{ 
$rowsum = 0; 
foreach ( $this->verticalColumn as $j ) 
{ 
$rowsum += $this->pivotValue [$i] [$j]; 
} 
$this->pivotValue [$i] [$this->TOTAL_FIELD] = $rowsum; 
} 
} 
/** 
* 设置横向合计 
*/ 
private function setHorizontalTotal() 
{ 
$this->horizontalColumn [] = $this->HORIZONTAL_TOTAL_FIELD; 
foreach ( $this->verticalColumn as $i ) 
{ 
$rowsum = 0; 
foreach ( $this->horizontalColumn as $j ) 
{ 
$rowsum += $this->pivotValue [$j] [$i]; 
} 
$this->pivotValue [$this->HORIZONTAL_TOTAL_FIELD] [$i] = $rowsum; 
} 
} 
/** 
* 渲染 
*/ 
function Render() 
{ 
echo '<pre>'; 
print_r ( $this->pivotValue ); 
} 
/** 
* 渲染为table 
*/ 
function RenderToTable() 
{ 
$resault = "<table border='1' width='250'>\n"; 
$resault .= "<tr><td>$this->title</td>\n"; 
foreach ( $this->verticalColumn as $value ) 
{ 
$resault .= "<td>$value</td>\n"; 
} 
$resault .= "</tr>\n"; 
foreach ( $this->horizontalColumn as $i ) 
{ 
$resault .= "<tr><td>$i</td>\n"; 
foreach ( $this->pivotValue [$i] as $value ) 
{ 
$resault .= "<td>$value</td>\n"; 
} 
$resault .= "</tr>\n"; 
} 
$resault .= "</table>"; 
return $resault; 
} 
/** 
* 构造交叉表 
* @param $data 数据源 
* @param $topPivot 头栏目字段 
* @param $leftPivot 左栏目字段 
* @param $measure 计算量 
*/ 
function __construct(array $data, $topPivot, $leftPivot, $measure) 
{ 
$this->data = $data; 
$this->leftPivot = $leftPivot; 
$this->topPivot = $topPivot; 
$this->measure = $measure; 
$this->horizontalColumn = array (); 
$this->verticalColumn = array (); 
$this->InitPivot (); 
$this->fillData (); 
} 
}

重点在于InitPivot方法及fillData方法。
InitPivot里面保证了所有的item都会有值(默认为0)
fillData方法使用选择填充添加的方法,将数据填充入我们装数据的$pivotValue里面。

然后喜欢怎么输出都可以了

PHP 相关文章推荐
用PHP生成html分页列表的代码
Mar 18 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
很好用的PHP数据库类
May 27 PHP
需要发散思维学习PHP
Jun 29 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
有关PHP性能优化的介绍
Jun 20 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
php垃圾代码优化操作代码
Aug 05 #PHP
PHP MemCached 高级缓存应用代码
Aug 05 #PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 #PHP
PHP合并数组+与array_merge的区别分析
Aug 01 #PHP
PHP自定义函数收代码
Aug 01 #PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 #PHP
PHP5中使用PDO连接数据库的方法
Aug 01 #PHP
You might like
基于文本的搜索
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
python实现寻找最长回文子序列的方法
2018/06/02 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
公务员职业生涯规划书范文  
2014/01/19 职场文书
销售冠军获奖感言
2014/02/03 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
党员转正介绍人意见
2015/06/03 职场文书
胡桃夹子观后感
2015/06/11 职场文书