|
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
|
|
|
|