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 相关文章推荐
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
关于js与php互相传值的介绍
Jun 25 PHP
php图片缩放实现方法
Feb 20 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
php发送http请求的常用方法分析
Nov 08 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 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根据年月获取季度的方法
2014/03/31 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
javascript document.referrer 用法
2009/04/30 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
Python 多线程抓取图片效率对比
2016/02/27 Python
Python文件处理
2016/02/29 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
python数据类型强制转换实例详解
2020/06/22 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
工程质量承诺书
2014/03/27 职场文书
三方协议书范本
2014/04/22 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
大学生活动总结模板
2014/07/02 职场文书
综治工作心得体会
2014/09/11 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
检察院起诉书
2015/05/20 职场文书
医院病假条范文
2015/08/17 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
一起来学习Python的元组和列表
2022/03/13 Python
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android