Passed
Push — main ( 203f91...e5e48e )
by N.
03:27
created

Historik::summera()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 30
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 3
nop 2
dl 0
loc 30
ccs 0
cts 13
cp 0
crap 12
rs 9.8333
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Klass Historik.
5
 * @author Niklas Dougherty
6
 */
7
8
declare(strict_types=1);
9
10
namespace Tips\Moduler\Autospik;
11
12
use Tips\Egenskaper\Eka;
13
use Tips\Moduler\Autospik;
14
15
/**
16
 * Klass Historik.
17
 * Bygger historik över utfall av Autospik.
18
 * Enskilda respektive kumulativa andelar i procent.
19
 */
20
class Historik extends GridGarderingar {
21
	use Eka;
22
23
	protected string $historik = '';
24
25
	/**
26
	 * Historik för autospik.
27
	 * Rankad match 1 går in i 75 % av fallen.
28
	 * Matcher 1 och 2 i 52 %.
29
	 * 1, 2, 3 i 35 %.
30
	 */
31
	protected function autospik_historik(): void {
32
		$this->historik = <<< EOT
33
						<table class="höger">
34
							<tr class="match">
35
								<th>#</th>
36
								<th>Antal</th>
37
								<th>Andel %</th>
38
								<th>Kumulativ %</th>
39
							</tr>
40
41
EOT;
42
43
		/**
44
		 * Hämta prediktioner och tipsrader för samtliga kompletta omgångar.
45
		 */
46
		$historik = [];
47
		$prediktioner = $this->odds->prediktionsdata('odds');
48
		$tipsdata = $this->odds->tipsdata();
49
50
		/**
51
		 * Iterera över alla tipsrader.
52
		 */
53
		foreach ($tipsdata as $omgång => $tipsrad_012) {
54
			if (!isset($prediktioner[$omgång])) {
55
				continue;
56
			}
57
58
			/**
59
			 * Hämta summering.
60
			 */
61
			$summa = $this->summera($tipsrad_012, $prediktioner[$omgång]);
62
63
			/**
64
			 * Öka (eller sätt) summa för antal matcher som går in.
65
			 */
66
			$historik[$summa] = isset($historik[$summa]) ? $historik[$summa] + 1 : 1;
67
		}
68
69
		/**
70
		 * Reversera ordningen.
71
		 */
72
		krsort($historik);
73
		$this->bygg_historik($historik);
74
75
		/**
76
		 * Spara historik, uppdateras då omgång sparas generellt.
77
		 */
78
		$this->historik .= t(6, "</table>");
79
		$this->db_preferenser->spara_preferens('autospik.historik', $this->historik);
80
	}
81
82
	/**
83
	 * Summera.
84
	 * Räknar antalet konsekutiva spikar i favoritordning.
85
	 * @param array<int, float[]> $prediktioner
86
	 */
87
	private function summera(string $tipsrad_012, array $prediktioner): int {
88
		/**
89
		 * Sortera sannolikheter.
90
		 */
91
		$sannolikheter = odds_till_sannolikheter($prediktioner);
92
		$sortering = array_keys(ordna_sannolikheter($sannolikheter));
93
		$summa = 0;
94
95
		/**
96
		 * Iterera över ordnade sannolikheter.
97
		 * Så länge matcher går in ökas summan, annars bryts exekveringen.
98
		 */
99
		foreach ($sortering as $index) {
100
			if (
101
				array_search(
102
					ne_max($sannolikheter[$index]),
103
					$sannolikheter[$index],
104
					true
105
				) != $tipsrad_012[$index]
106
			) {
107
				break;
108
			}
109
110
			$summa++;
111
		}
112
113
		/**
114
		 * Skicka tillbaka.
115
		 */
116
		return $summa;
117
	}
118
119
	/**
120
	 * Bygg historik från data.
121
	 * @param int[] $historik
122
	 */
123
	private function bygg_historik(array $historik): void {
124
		/**
125
		 * Summan av alla utfall.
126
		 */
127
		$hsumma = array_sum($historik);
128
		$andel_kumulativ = 0;
129
130
		/**
131
		 * Reverserad ordning.
132
		 * Ex. 11 matcher i följd går in 1 gång, andel 0.1 %, kumulativ 0.10 %
133
		 * 10 matcher 1 gång, andel 0.1 %, kumulativ 0.19 %
134
		 * …
135
		 * 5 matcher 59 gånger. andel 5.72 %, kumulativ 12.61 %
136
		 * …
137
		 * 2 matcher 177 gånger, andel 17.17 %, kumulativ 74.49 %
138
		 */
139
		foreach ($historik as $autospikar => $antal) {
140
			/**
141
			 * Andelar och stil.
142
			 */
143
			$andel = 100 * $antal / $hsumma;
144
			$andel_kumulativ += $andel;
145
			$ackstil = stil($andel_kumulativ / 100); // gråskala 0–100 = vit till svart
146
147
			/**
148
			 * Eka ut HTML.
149
			 */
150
			$this->historik .= <<< EOT
151
							<tr>
152
								<td>$autospikar</td>
153
								<td>$antal</td>
154
								<td>{$this->eka((string) round($andel, 2))}</td>
155
								<td$ackstil>{$this->eka((string) number_format($andel_kumulativ, 2))}</td>
156
							</tr>
157
158
EOT;
159
		}
160
	}
161
}
162