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初学者头疼问题总结
Jul 08 PHP
PHP如何透过ODBC来存取数据库
Oct 09 PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
如何用php获取文件名后缀
Jun 09 PHP
基于php使用memcache存储session的详解
Jun 25 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
Smarty模板语法详解
Jul 20 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版本号
2006/10/09 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Django中ORM的基本使用教程
2020/12/22 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
中国最大的团购网站:聚划算
2016/09/21 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
住房公积金接收函
2014/01/09 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
初中生期末评语大全
2014/04/24 职场文书
心理学专业求职信
2014/06/16 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
党员违纪检讨书
2015/05/05 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
JavaScript实现简单的音乐播放器
2022/08/14 Javascript