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新手上路(三)
Oct 09 PHP
PHP 中文处理技巧
Apr 25 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
php远程下载类分享
Apr 13 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 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
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Python实现类继承实例
2014/07/04 Python
Python中关于使用模块的基础知识
2015/05/24 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
对python中return和print的一些理解
2017/08/18 Python
python opencv实现运动检测
2018/07/10 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
快餐店的创业计划书范文
2014/01/29 职场文书
党支部综合考察材料
2014/05/19 职场文书
竞赛口号大全
2014/06/16 职场文书
校庆标语集锦
2014/06/25 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
旷工辞退通知书
2015/04/17 职场文书
单位收入证明范本
2015/06/18 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android