Passed
Push — main ( f1b4ad...6ccac6 )
by N.
04:46
created

Andelar::andelar()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 32
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 16
nc 6
nop 0
dl 0
loc 32
ccs 18
cts 18
cp 1
crap 4
rs 9.7333
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Klass Andelar.
5
 * @author Niklas Dougherty
6
 */
7
8
declare(strict_types=1);
9
10
namespace Tips\Moduler\Andel;
11
12
use PDO;
13
14
/**
15
 * Klass Andelar.
16
 */
17
class Andelar extends Prova {
18
	/**
19
	 * Beräkna andelar av tecken i en rad.
20
	 * Vanligast fördelningar av 1X2 är 6-3-4, 6-4-3, 6-2-5 och 7-3-3.
21
	 * Ovanligast är skeva fördelningar.
22
	 * Tio vanligaste fördelningarna motsvarar 50 % av alla rader.
23
	 */
24 1
	protected function andelar(): string {
25 1
		$andelsdata = []; // håller historiskt antal av respektive andel
26
27
		/**
28
		 * Generera alla möjliga kombinationer av antal 1X2.
29
		 * Summan av antal 1X2 är alltid 13.
30
		 */
31 1
		foreach ($rymd = range(0, MATCHANTAL) as $rymd0) {
32 1
			foreach ($rymd as $rymd1) {
33 1
				$rymd2 = MATCHANTAL - $rymd0 - $rymd1; // entydigt bestämd
34 1
				$andelsdata["$rymd0-$rymd1-$rymd2"] = 0;
35
			}
36
		}
37
38
		/**
39
		 * Hämta tipsrad för alla omgångar.
40
		 * Ta fram fördelning över teckenandelar.
41
		 */
42 1
		$antal_tipsrader =  0; // totalt antal rader
43 1
		$sats = $this->utdelning->spel->db->instans->prepare(
44 1
			"SELECT `omgång`, `u12`, `tipsrad_012` FROM `utdelning`
45 1
			WHERE `tipsrad_012` AND `u12` ORDER BY `u12` DESC"
46 1
		);
47 1
		$sats->execute();
48 1
		foreach ($sats->fetchAll(PDO::FETCH_ASSOC) as $rad) {
49 1
			$antal_tipsrader++;
50 1
			$fördelning = $this->teckenfördelning($rad['tipsrad_012']);
51 1
			$andelsdata["{$fördelning[0]}-{$fördelning[1]}-{$fördelning[2]}"]++;
52
		}
53
54 1
		arsort($andelsdata);
55 1
		return $this->beräkna_andelar($andelsdata, $antal_tipsrader);
56
	}
57
58
	/**
59
	 * Sammanfatta andelar.
60
	 * @param array<string, int> $andelsdata
61
	 */
62 1
	private function beräkna_andelar(array $andelsdata, int $antal_tipsrader): string {
63 1
		$text = '';
64 1
		$kumlativ_andel = '';
65 1
		$antal_valda =  0;
66
67 1
		foreach ($andelsdata as $index => $data) {
68 1
			if ($data >= 1) { // ta bara med verkliga utfall
69 1
				$antal_valda += $data;
70 1
				$kumlativ_andel = number_format(100 * $antal_valda / $antal_tipsrader, 2);
71
72 1
				$spred = array_map('intval', explode('-', $index));
73 1
				$stil = $this->pröva_andelar($spred) ? 'class="vinst"' : 'class="storförlust"';
74
75 1
				$text .= t(5, "<span $stil>$index</span> => $data | $kumlativ_andel %<br>");
76
			}
77
		}
78
79 1
		return $text . t(5, "<p>Andelar:<br>$antal_valda / $antal_tipsrader = $kumlativ_andel %</p>");
80
	}
81
}
82