Passed
Push — main ( e5e48e...78d8c3 )
by N.
05:08
created

Historik::segment()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 7
nc 4
nop 1
dl 0
loc 15
ccs 8
cts 8
cp 1
crap 4
rs 10
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\Distribution;
11
12
use PDO;
13
use Tips\Egenskaper\Eka;
14
15
/**
16
 * Klass Historik.
17
 * Förekomst av procentintervall för några godtyckliga segment.
18
 * Det visar sig att 2/3 av alla omgångar faller inom 10 %.
19
 */
20
class Historik extends Radera {
21
	use Eka;
22
	use Konstanter;
23
24
	public string $historik = '';
25
26
	/**
27
	 * Historik för distribution.
28
	 */
29 1
	public function historik(): void {
30
		/**
31
		 * Tabellhuvud.
32
		 */
33 1
		$this->historik = <<< EOT
34
						<table>
35
							<tr class="match">
36
								<th>Andel rader</th><th>Förekomst</th><th>Ackumulerad</th><th>Antal rader</th>
37
							</tr>
38
39 1
EOT;
40
41
		/**
42
		 * Sammanställ procentandelar.
43
		 */
44 1
		$procentandelar = $this->procentandelar();
45 1
		$antal = count($procentandelar);
46 1
		$ackumlerad_andel = 0.0;
47
48
		/**
49
		 * Segment definieras godtyckligt som intervall över några procentsatser.
50
		 * 25 % av alla utfall hamnar inom 1 % rader i denna distribution.
51
		 * 35 % inom 2 %, 50 % inom 4 % och 65 % inom 10 %.
52
		 * Det sistnämnda är 90 % reduktion, motsvarande två säkra matcher.
53
		 */
54 1
		foreach ($this->segment($procentandelar) as $procentsats => $antal_per_segment) {
55 1
			$procent = (float) $procentsats;
56 1
			$andel = count($antal_per_segment) * 100 / $antal;
57 1
			$ackumlerad_andel += $andel;
58
59
			/**
60
			 * Bygg tabellrader.
61
			 */
62 1
			$this->historik .= <<< EOT
63 1
							<tr class="höger">
64 1
								<td>≤ {$this->eka(number_format($procent, 2))} %</td>
65 1
								<td>{$this->eka(number_format($andel, 2, '.', ' '))} %</td>
66 1
								<td>{$this->eka(number_format($ackumlerad_andel, 2))} %</td>
67 1
								<td>{$this->eka(number_format($procent * MATCHRYMD / 100, 0, '.', ' '))}</td>
68
							</tr>
69
70 1
EOT;
71
		}
72
73
		/**
74
		 * Tabulera och spara.
75
		 */
76 1
		$this->historik .= t(6, "</table>");
77 1
		$this->db_preferenser->spara_preferens('distribution.historik', $this->historik);
78
	}
79
80
	/**
81
	 * Hämta segment.
82
	 * @param float[] $procentandelar
83
	 * @return array<int|string, float[]>
84
	 */
85 1
	private function segment(array $procentandelar): array {
86
		/**
87
		 * Iterera över segment och addera förekomst.
88
		 */
89 1
		$segment = [];
90 1
		foreach ($procentandelar as $procentandel) {
91 1
			foreach (self::DISTRIBUTION_GRÄNSER as $gräns) {
0 ignored issues
show
Bug introduced by
The constant Tips\Moduler\Distributio...::DISTRIBUTION_GRÄNSER was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
92 1
				if ($procentandel <= $gräns) {
93 1
					$segment[strval($gräns)][] = $procentandel;
94 1
					break;
95
				}
96
			}
97
		}
98
99 1
		return $segment;
100
	}
101
102
	/**
103
	 * Hämta procentandelar.
104
	 * @return float[]
105
	 */
106 1
	private function procentandelar(): array {
107
		/**
108
		 * Hämta procentandelar.
109
		 */
110 1
		$sats = $this->odds->spel->db->instans->prepare("SELECT `procentandel`
111 1
			FROM `distribution` WHERE `oddssumma`>0");
112 1
		$sats->execute();
113 1
		$procentandelar = $sats->fetchAll(PDO::FETCH_COLUMN, 0);
114 1
		sort($procentandelar);
115
116
		/**
117
		 * Skicka hem.
118
		 */
119 1
		return $procentandelar;
120
	}
121
}
122