/** * See {@link GroupBy}. * * @param DataTable $table */ public function filter($table) { /** @var Row[] $groupByRows */ $groupByRows = array(); $nonGroupByRowIds = array(); foreach ($table->getRowsWithoutSummaryRow() as $rowId => $row) { $groupByColumnValue = $row->getColumn($this->groupByColumn); $groupByValue = $groupByColumnValue; // reduce the group by column of this row if ($this->reduceFunction) { $parameters = array_merge(array($groupByColumnValue), $this->parameters); $groupByValue = call_user_func_array($this->reduceFunction, $parameters); } if (!isset($groupByRows[$groupByValue])) { // if we haven't encountered this group by value before, we mark this row as a // row to keep, and change the group by column to the reduced value. $groupByRows[$groupByValue] = $row; $row->setColumn($this->groupByColumn, $groupByValue); } else { // if we have already encountered this group by value, we add this row to the // row that will be kept, and mark this one for deletion $groupByRows[$groupByValue]->sumRow($row, $copyMeta = true, $table->getMetadata(DataTable::COLUMN_AGGREGATION_OPS_METADATA_NAME)); $nonGroupByRowIds[] = $rowId; } } if ($this->groupByColumn === 'label') { $table->setLabelsHaveChanged(); } // delete the unneeded rows. $table->deleteRows($nonGroupByRowIds); }
/** * See {@link ColumnCallbackReplace}. * * @param DataTable $table */ public function filter($table) { foreach ($table->getRows() as $row) { $extraColumnParameters = array(); foreach ($this->extraColumnParameters as $columnName) { $extraColumnParameters[] = $row->getColumn($columnName); } foreach ($this->columnsToFilter as $column) { // when a value is not defined, we set it to zero by default (rather than displaying '-') $value = $this->getElementToReplace($row, $column); if ($value === false) { $value = 0; } $parameters = array_merge(array($value), $extraColumnParameters); if (!is_null($this->functionParameters)) { $parameters = array_merge($parameters, $this->functionParameters); } $newValue = call_user_func_array($this->functionToApply, $parameters); $this->setElementToReplace($row, $column, $newValue); $this->filterSubTable($row); } } if (in_array('label', $this->columnsToFilter)) { // we need to force rebuilding the index $table->setLabelsHaveChanged(); } }