Passed
Branch dev-1.7.x (fa2fc5)
by Boudry
03:29
created

Result::next()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
/*
3
    Condorcet PHP - Election manager and results calculator.
4
    Designed for the Condorcet method. Integrating a large number of algorithms extending Condorcet. Expandable for all types of voting systems.
5
6
    By Julien Boudry and contributors - MIT LICENSE (Please read LICENSE.txt)
7
    https://github.com/julien-boudry/Condorcet
8
*/
9
declare(strict_types=1);
10
11
namespace Condorcet;
12
13
14
use Condorcet\ElectionProcess\VoteUtil;
15
16
17
class Result implements \ArrayAccess, \Countable, \Iterator 
18
{
19
    use CondorcetVersion;
20
21
    // Implement Iterator
22
23 1
    public function rewind() :void {
24 1
        reset($this->_UserResult);
25 1
    }
26
27 1
    public function current () {
28 1
        return current($this->_UserResult);
29
    }
30
31 1
    public function key () : int {
32 1
        return key($this->_UserResult);
33
    }
34
35 1
    public function next () : void {
36 1
        next($this->_UserResult);
37 1
    }
38
39 1
    public function valid () : bool {
40 1
        return (key($this->_UserResult) === null) ? false : true;
41
    }
42
43
    // Implement ArrayAccess
44
45 1
    public function offsetSet ($offset, $value) : void {
46 1
        throw new CondorcetException (0,"Can't change a result");
47
    }
48
49 1
    public function offsetExists ($offset) : bool {
50 1
        return isset($this->_UserResult[$offset]);
51
    }
52
53 1
    public function offsetUnset ($offset) : void {
54 1
        throw new CondorcetException (0,"Can't change a result");
55
    }
56
57 50
    public function offsetGet ($offset) {
58 50
        return $this->_UserResult[$offset] ?? null;
59
    }
60
61
    // Implement Countable
62
63 3
    public function count () : int {
64 3
        return count($this->_UserResult);
65
    }
66
67
68
/////////// CONSTRUCTOR ///////////
69
70
    protected $_Result;
71
    protected $_UserResult;
72
    protected $_stringResult;
73
    protected $_CondorcetWinner;
74
    protected $_CondorcetLoser;
75
76
    protected $_Stats;
77
78
    protected $_warning = [];
79
80
    protected $_BuildTimeStamp;
81
    protected $_fromMethod;
82
    protected $_byClass;
83
    protected $_ElectionCondorcetVersion;
84
85
86 84
    public function __construct (string $fromMethod, string $byClass, Election $election, array $result, $stats)
87
    {
88 84
        ksort($result, SORT_NUMERIC);
89
90 84
        $this->_Result = $result;
91 84
        $this->_UserResult = $this->makeUserResult($election);
92 84
        $this->_stringResult = $this->getResultAsArray(true);
93 84
        $this->_Stats = $stats;
94 84
        $this->_fromMethod = $fromMethod;
95 84
        $this->_byClass = $byClass;
96 84
        $this->_ElectionCondorcetVersion = $election->getObjectVersion();
97 84
        $this->_CondorcetWinner = $election->getWinner();
98 84
        $this->_CondorcetLoser = $election->getLoser();
99 84
        $this->_BuildTimeStamp = microtime(true);
100 84
    }
101
102
103
/////////// Get Result ///////////
104
105 84
    public function getResultAsArray (bool $convertToString = false) : array
106
    {
107 84
        $r = $this->_UserResult;
108
109 84
        foreach ($r as &$rank) :
110 84
            if (count($rank) === 1) :
111 80
                $rank = ($convertToString) ? (string) $rank[0] : $rank[0];
112 28
            elseif ($convertToString) :
113 28
                foreach ($rank as &$subRank) :
114 84
                    $subRank = (string) $subRank;
115
                endforeach;
116
            endif;
117
        endforeach;
118
119 84
        return $r;
120
    }
121
122 3
    public function getResultAsString ()
123
    {
124 3
        return VoteUtil::getRankingAsString($this->getResultAsArray(true));
125
    }
126
127 1
    public function getOriginalArrayWithString () : array
128
    {
129 1
        return $this->_stringResult;
130
    }
131
132
    public function getResultAsInternalKey () : array
133
    {
134
        return $this->_Result;
135
    }
136
137 19
    public function getStats () {
138 19
        return $this->_Stats;
139
    }
140
141 49
    public function getWinner () {
142 49
        return CondorcetUtil::format($this[1],false);
143
    }
144
145 3
    public function getLoser () {
146 3
        return CondorcetUtil::format($this[count($this)],false);
147
    }
148
149 1
    public function getCondorcetWinner () {
150 1
        return $this->_CondorcetWinner;
151
    }
152
153 1
    public function getCondorcetLoser () {
154 1
        return $this->_CondorcetLoser;
155
    }
156
157 84
    protected function makeUserResult (Election $election) : array
158
    {
159 84
        $userResult = [];
160
161 84
        foreach ( $this->_Result as $key => $value ) :
162 84
            if (is_array($value)) :
163 80
                foreach ($value as $candidate_key) :
164 80
                    $userResult[$key][] = $election->getCandidateId($candidate_key);
165
                endforeach;
166 6
            elseif (is_null($value)) :
167
                $userResult[$key] = null;
168
            else :
169 84
                $userResult[$key][] = $election->getCandidateId($value);
170
            endif;
171
        endforeach;
172
173 84
        foreach ( $userResult as $key => $value ) :
174 84
            if (is_null($value)) :
175 84
                $userResult[$key] = null;
176
            endif;
177
        endforeach;
178
179 84
        return $userResult;
180
    }
181
182
183
/////////// Get & Set MetaData ///////////
184
185 1
    public function addWarning (int $type, string $msg = null) : bool
186
    {
187 1
        $this->_warning[] = ['type' => $type, 'msg' => $msg];
188
189 1
        return true;
190
    }
191
192 2
    public function getWarning ($type = null) : array
193
    {
194 2
        if ($type === null) :
195
            return $this->_warning;
196
        else :
197 2
            $r = [];
198
199 2
            foreach ($this->_warning as $oneWarning) :
200 1
                if ($oneWarning['type'] === (int) $type) :
201 1
                    $r[] = $oneWarning;
202
                endif;
203
            endforeach;
204
205 2
            return $r;
206
        endif;
207
    }
208
209 1
    public function getClassGenerator () : string {
210 1
        return $this->_byClass;
211
    }
212
213 1
    public function getMethod () : string {
214 1
        return $this->_fromMethod;
215
    }
216
217 1
    public function getBuildTimeStamp () : float {
218 1
        return (float) $this->_BuildTimeStamp;
219
    }
220
221 1
    public function getCondorcetElectionGeneratorVersion () : string {
222 1
        return $this->_ElectionCondorcetVersion;
223
    }
224
}
225