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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php微信开发之音乐回复功能
Jun 14 PHP
thinkphp5使html5实现动态跳转的例子
Oct 16 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 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
给php新手谈谈我的学习心得
2007/02/25 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
Python运算符重载用法实例
2015/05/28 Python
python实现折半查找和归并排序算法
2017/04/14 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
python 6种方法实现单例模式
2020/12/15 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
个人求职信范文分享
2013/12/13 职场文书
会计专业毕业生求职信分享
2014/01/03 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
暑期培训班策划方案
2014/08/26 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
Python+Appium新手教程
2021/04/17 Python
JS实现简单九宫格抽奖
2022/06/28 Javascript