Morpher::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: rikosage
5
 * Date: 22/01/19
6
 * Time: 23:42
7
 */
8
9
namespace rikosage\NumberWordify\Base;
10
11
use rikosage\NumberWordify\Formatter;
12
use rikosage\NumberWordify\Unit\UnitInterface;
13
14
/**
15
 * Основной компонент, выполняющий склонение числительных
16
 *
17
 * @package rikosage\NumberWordify\Base
18
 */
19
class Morpher
20
{
21
    private $config = [
22
        Formatter::THOUSAND_UNIT_ITEM => [
23
            'gender' => Declinable::TYPE_FEMININE,
24
            'items' => ['тысяча', 'тысячи', 'тысяч'],
25
        ],
26
        Formatter::MILLION_UNIT => [
27
            'gender' => Declinable::TYPE_MASCULINE,
28
            'items' => ['миллион', 'миллиона', 'миллионов'],
29
        ],
30
        Formatter::BILLION_UNIT => [
31
            'gender' => Declinable::TYPE_MASCULINE,
32
            'items' => ['миллиард', 'миллиарда', 'миллиардов'],
33
        ],
34
        Formatter::TRILLION_UNIT => [
35
            'gender' => Declinable::TYPE_MASCULINE,
36
            'items' => ['триллион', 'триллиона', 'триллионов'],
37
        ],
38
    ];
39
40
    /* @var UnitInterface|null */
41
    private $unit;
42
43
    /**
44
     * В конструктор передаются единицы измерения
45
     *
46
     * @param UnitInterface|null $unit
47
     */
48
    public function __construct(?UnitInterface $unit)
49
    {
50
        $this->unit = $unit;
51
    }
52
53
    /**
54
     * Получить род единиц измерения
55
     *
56
     * @param int $kind
57
     * @return int
58
     */
59
    public function getUnitGender($kind)
60
    {
61
        if ($kind === Formatter::SINGLE_UNIT_ITEM) {
62
            return $this->unit ? $this->unit->getGender() : Declinable::TYPE_MASCULINE;
63
        }
64
        return $this->config[$kind]['gender'];
65
    }
66
67
    /**
68
     * Получить варианты для склонения
69
     *
70
     * @param int $kind
71
     * @return array
72
     */
73
    public function getUnitItems($kind) : array
74
    {
75
        if ($kind === Formatter::SINGLE_UNIT_ITEM) {
76
            return $this->unit ? $this->unit->getItems() : [];
77
        }
78
        return $this->config[$kind]['items'];
79
    }
80
81
    /**
82
     * Выбирает нужное склонение из возможных
83
     *
84
     * @param int $num
85
     * @param array $variants
86
     * @return string|null
87
     */
88
    public function morph(int $num, array $variants) : ?string
89
    {
90
        if (empty($variants)) {
91
            return null;
92
        }
93
94
        $cases = [2, 0, 1, 1, 1, 2];
95
        return $variants[($num % 100 > 4 && $num % 100 < 20) ? 2 : $cases[min($num % 10, 5)]];
96
    }
97
98
}