SQL ステートメントを使用すると負荷が高すぎるため、クロス集計クラスを自分で作成してみます。早速、コードを見てみましょう。
Copy code コードは次のとおりです。
/**
* 基本的なクロス集計
* @author ヒュー
*
*/
class Pivot
{
private $HORIZONTAL_TOTAL_FIELD = 'total';
private $VERTICAL_TOTAL_FIELD = 'total ';
private $data;
private $leftPivot;
private $horizontalColumn;
プライベート $verticalColumn = 配列 ();
プライベート $isVerticalTotal = true; 🎜>private $verticalTotal = null;
private $title = 'PivotTab';
/**
* クロス集計を初期化します
*/
プライベート関数 InitPivot()
{
$this-> topPivot;
foreach ( $this ->data as $d )
{
$this->horizontalColumn [] = $d [$this->leftPivot]; >verticalColumn [] = $d [ $this->topPivot];
$this->horizontalColumn = array_unique ( $this->horizontalColumn ); = array_unique ( $this->verticalColumn );
$reasult = array ();
foreach ( $this->horizontalColumn as $h )
{
foreach ( $this-> verticalColumn as $v )
{
$this->pivotValue [$h] [$v] = 0;
}
}
}
/**
* データを入力
*/
プライベート関数 fillData( )
{
foreach ( $this->data as $row )
{
$this->pivotValue [$row [$this->gt ;leftPivot]] [$row [$ this->topPivot]] = $row [$this->measure];
}
if ($this->is水平合計)
{
$this->set水平合計 () ;
}
if ($this->isVerticalTotal)
{
$this->setVerticalTotal ()
}
/**
* 垂直合計を設定します
*/
プライベート関数 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;
}
/ **
* 水平合計を設定します
*/
プライベート関数 set水平合計()
{
$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 '
';
print_r ( $this->pivotValue );
/**
* テーブルとしてレンダリング
*/
function RenderToTable( )
{
$resault = "
$ value | n";|
$i | n";$value< ;/td>n"; } $resault .= " |