public function testBuildWithOrder() { $table = array(array('a' => 'a', 'b' => 'b', 'c' => 'c'), array('a' => 'A', 'b' => 'B', 'c' => 'C')); $headers = array('a' => 'Alpha', 'b' => 'Bravo', 'c' => 'Charly'); $statsTableBuilder = new StatsTableBuilder($table, $headers, array(Format::STRING, Format::STRING)); $statsTable = $statsTableBuilder->build(array('c', 'a')); $this->assertEquals(array('c' => 'Charly', 'a' => 'Alpha'), $statsTable->getHeaders()); }
/** * Do a groupBy on columns, using aggregations to aggregate data per line * * @param string|array $columns Columns to aggregate * @param array $excludeColumns Irrelevant columns to exclude * * @return StatsTableBuilder */ public function groupBy($columns, array $excludeColumns = array()) { $groupedData = array(); $statsTable = $this->build(); foreach ($statsTable->getData() as $line) { $key = join('-_##_-', array_map(function ($c) use($line) { return $line[$c]; }, $columns)); $groupedData[$key][] = $line; } $filterLine = function ($line) use($excludeColumns) { foreach ($excludeColumns as $c) { unset($line[$c]); } return $line; }; $headers = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getHeaderName(); }, $this->columns)); $formats = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getFormat(); }, $this->columns)); $aggregations = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getAggregation(); }, $this->columns)); $metaData = $filterLine(array_map(function (StatsColumnBuilder $c) { return $c->getMetaData(); }, $this->columns)); $data = array(); foreach ($groupedData as $lines) { $tmpAggregations = $aggregations; // Add static aggragation for group by fields foreach ($columns as $column) { $oneLine = current($lines); $value = $oneLine[$column]; $tmpAggregations[$column] = new StaticAggregation($value, Format::STRING); } $tmpTableBuilder = new StatsTableBuilder(array_map($filterLine, $lines), $headers, $formats, $tmpAggregations, array(), array(), null, $metaData); $tmpTable = $tmpTableBuilder->build(); $data[] = $tmpTable->getAggregations(); } return new StatsTableBuilder($data, $headers, $formats, $aggregations, array(), array(), null, $metaData); }