PHP Array交叉表实现代码
2015-01-24信息快讯网
/** * 基本交叉表 * @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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
PHP写UltraEdit插件脚本实现方法
php使用Smarty的相关注意事项及访问变量的几种方式
PHP性能优化工具篇Benchmark类调试执行时间
PHP性能优化准备篇图解PEAR安装
PHP的array_diff()函数在处理大数组时的效率问题
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
php array_filter除去数组中的空字符元素
php数组函数序列之array_pop() - 删除数组中的最后一个元素
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
PHP MemCached高级缓存配置图文教程
php垃圾代码优化操作代码
PHP合并数组+与array_merge的区别分析
PHP中的array数组类型分析说明
PHP array 的加法操作代码
PHP IN_ARRAY 函数使用注意事项
PHP中文URL编解码(urlencode()rawurlencode()
PHP XML error parsing SOAP payload on line 1
PHP array_flip() 删除重复数组元素专用函数