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 xfocus防注入资料
Apr 27 PHP
PHP基础知识回顾
Aug 16 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
php无限级分类实现评论及回复功能
Feb 18 PHP
php引用和拷贝的区别知识点总结
Sep 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学习之PHP表达式
2006/10/09 PHP
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python基本语法经典教程
2016/03/11 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python分类测试代码实例汇总
2020/07/23 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
西式结婚主持词
2014/03/14 职场文书
白酒代理协议书范本
2014/10/26 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python