xref: /plugin/strata/aggregates/sum.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
1*5153720fSfkaag71<?php
2*5153720fSfkaag71/**
3*5153720fSfkaag71 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
4*5153720fSfkaag71 * @author     Brend Wanders <b.wanders@utwente.nl>
5*5153720fSfkaag71 */
6*5153720fSfkaag71// must be run within Dokuwiki
7*5153720fSfkaag71if(!defined('DOKU_INC')) die('Meh.');
8*5153720fSfkaag71
9*5153720fSfkaag71/**
10*5153720fSfkaag71 * The summation aggregator.
11*5153720fSfkaag71 */
12*5153720fSfkaag71class plugin_strata_aggregate_sum extends plugin_strata_aggregate {
13*5153720fSfkaag71    function aggregate($values, $hint = null) {
14*5153720fSfkaag71        if($hint == 'strict') {
15*5153720fSfkaag71            return array_reduce($values, function(&$state, $item) {
16*5153720fSfkaag71                if(is_numeric($item)) {
17*5153720fSfkaag71                    $state[0] += $item;
18*5153720fSfkaag71                } else {
19*5153720fSfkaag71                    $state[] = $item;
20*5153720fSfkaag71                }
21*5153720fSfkaag71                return $state;
22*5153720fSfkaag71            }, array(0));
23*5153720fSfkaag71        } else {
24*5153720fSfkaag71            return array(array_sum($values));
25*5153720fSfkaag71        }
26*5153720fSfkaag71    }
27*5153720fSfkaag71
28*5153720fSfkaag71    function getInfo() {
29*5153720fSfkaag71        return array(
30*5153720fSfkaag71            'desc'=>'Sums up all items. Any item that does not have a clear numeric value (i.e. starts with a number) is counted as 0. If the \'strict\' hint is used, values that are not strictly numeric (i.e. contains only a number) are left intact.',
31*5153720fSfkaag71            'hint'=>'\'strict\' to leave non-numeric values',
32*5153720fSfkaag71            'tags'=>array('numeric')
33*5153720fSfkaag71        );
34*5153720fSfkaag71    }
35*5153720fSfkaag71}
36