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 相关文章推荐
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
基于MySQL体系结构的分析
May 02 PHP
php中通过curl检测页面是否被百度收录
Sep 27 PHP
php格式化电话号码的方法
Apr 24 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php实现的中文分词类完整实例
Feb 06 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
Sep 27 PHP
laravel 获取当前url的别名方法
Oct 11 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 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
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
vue实现计步器功能
2019/11/01 Javascript
利用Python获取操作系统信息实例
2016/09/02 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
个人简历自我鉴定
2013/10/11 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
婚宴领导致辞
2015/07/28 职场文书
2016高考感言
2015/08/01 职场文书
教你用python控制安卓手机
2021/05/13 Python
python实现简单聊天功能
2021/07/07 Python
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫