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 FPDF类库应用实现代码
Mar 20 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
PHP线程的内存回收问题
Jul 08 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 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
MySQL修改密码方法总结
2008/03/25 PHP
php实现源代码加密的方法
2015/07/11 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
采用call方式实现js继承
2014/05/20 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
BootStrap中
2016/12/10 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
Django admin美化插件suit使用示例
2017/12/12 Python
python3实现名片管理系统
2020/11/29 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
公务员试用期满考核材料
2014/05/22 职场文书
求职信怎么写
2014/05/23 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript