Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1441 ariadna 1
<?php
2
 
3
namespace PhpOffice\PhpSpreadsheet\Calculation\Statistical;
4
 
5
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
6
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
7
 
8
class Variances extends VarianceBase
9
{
10
    /**
11
     * VAR.
12
     *
13
     * Estimates variance based on a sample.
14
     *
15
     * Excel Function:
16
     *        VAR(value1[,value2[, ...]])
17
     *
18
     * @param mixed ...$args Data values
19
     *
20
     * @return float|string (string if result is an error)
21
     */
22
    public static function VAR(mixed ...$args): float|string
23
    {
24
        $returnValue = ExcelError::DIV0();
25
 
26
        $summerA = $summerB = 0.0;
27
 
28
        // Loop through arguments
29
        $aArgs = Functions::flattenArray($args);
30
        $aCount = 0;
31
        foreach ($aArgs as $arg) {
32
            $arg = self::datatypeAdjustmentBooleans($arg);
33
 
34
            // Is it a numeric value?
35
            if ((is_numeric($arg)) && (!is_string($arg))) {
36
                $summerA += ($arg * $arg);
37
                $summerB += $arg;
38
                ++$aCount;
39
            }
40
        }
41
 
42
        if ($aCount > 1) {
43
            $summerA *= $aCount;
44
            $summerB *= $summerB;
45
 
46
            return ($summerA - $summerB) / ($aCount * ($aCount - 1));
47
        }
48
 
49
        return $returnValue;
50
    }
51
 
52
    /**
53
     * VARA.
54
     *
55
     * Estimates variance based on a sample, including numbers, text, and logical values
56
     *
57
     * Excel Function:
58
     *        VARA(value1[,value2[, ...]])
59
     *
60
     * @param mixed ...$args Data values
61
     *
62
     * @return float|string (string if result is an error)
63
     */
64
    public static function VARA(mixed ...$args): string|float
65
    {
66
        $returnValue = ExcelError::DIV0();
67
 
68
        $summerA = $summerB = 0.0;
69
 
70
        // Loop through arguments
71
        $aArgs = Functions::flattenArrayIndexed($args);
72
        $aCount = 0;
73
        foreach ($aArgs as $k => $arg) {
74
            if ((is_string($arg)) && (Functions::isValue($k))) {
75
                return ExcelError::VALUE();
76
            } elseif ((is_string($arg)) && (!Functions::isMatrixValue($k))) {
77
            } else {
78
                // Is it a numeric value?
79
                if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {
80
                    $arg = self::datatypeAdjustmentAllowStrings($arg);
81
                    $summerA += ($arg * $arg);
82
                    $summerB += $arg;
83
                    ++$aCount;
84
                }
85
            }
86
        }
87
 
88
        if ($aCount > 1) {
89
            $summerA *= $aCount;
90
            $summerB *= $summerB;
91
 
92
            return ($summerA - $summerB) / ($aCount * ($aCount - 1));
93
        }
94
 
95
        return $returnValue;
96
    }
97
 
98
    /**
99
     * VARP.
100
     *
101
     * Calculates variance based on the entire population
102
     *
103
     * Excel Function:
104
     *        VARP(value1[,value2[, ...]])
105
     *
106
     * @param mixed ...$args Data values
107
     *
108
     * @return float|string (string if result is an error)
109
     */
110
    public static function VARP(mixed ...$args): float|string
111
    {
112
        // Return value
113
        $returnValue = ExcelError::DIV0();
114
 
115
        $summerA = $summerB = 0.0;
116
 
117
        // Loop through arguments
118
        $aArgs = Functions::flattenArray($args);
119
        $aCount = 0;
120
        foreach ($aArgs as $arg) {
121
            $arg = self::datatypeAdjustmentBooleans($arg);
122
 
123
            // Is it a numeric value?
124
            if ((is_numeric($arg)) && (!is_string($arg))) {
125
                $summerA += ($arg * $arg);
126
                $summerB += $arg;
127
                ++$aCount;
128
            }
129
        }
130
 
131
        if ($aCount > 0) {
132
            $summerA *= $aCount;
133
            $summerB *= $summerB;
134
 
135
            return ($summerA - $summerB) / ($aCount * $aCount);
136
        }
137
 
138
        return $returnValue;
139
    }
140
 
141
    /**
142
     * VARPA.
143
     *
144
     * Calculates variance based on the entire population, including numbers, text, and logical values
145
     *
146
     * Excel Function:
147
     *        VARPA(value1[,value2[, ...]])
148
     *
149
     * @param mixed ...$args Data values
150
     *
151
     * @return float|string (string if result is an error)
152
     */
153
    public static function VARPA(mixed ...$args): string|float
154
    {
155
        $returnValue = ExcelError::DIV0();
156
 
157
        $summerA = $summerB = 0.0;
158
 
159
        // Loop through arguments
160
        $aArgs = Functions::flattenArrayIndexed($args);
161
        $aCount = 0;
162
        foreach ($aArgs as $k => $arg) {
163
            if ((is_string($arg)) && (Functions::isValue($k))) {
164
                return ExcelError::VALUE();
165
            } elseif ((is_string($arg)) && (!Functions::isMatrixValue($k))) {
166
            } else {
167
                // Is it a numeric value?
168
                if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) {
169
                    $arg = self::datatypeAdjustmentAllowStrings($arg);
170
                    $summerA += ($arg * $arg);
171
                    $summerB += $arg;
172
                    ++$aCount;
173
                }
174
            }
175
        }
176
 
177
        if ($aCount > 0) {
178
            $summerA *= $aCount;
179
            $summerB *= $summerB;
180
 
181
            return ($summerA - $summerB) / ($aCount * $aCount);
182
        }
183
 
184
        return $returnValue;
185
    }
186
}