Passed
Push — master ( 212be5...c19724 )
by Smoren
02:15
created

partialIntersectionFunctionStyle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 4
c 1
b 0
f 1
nc 1
nop 2
dl 0
loc 6
ccs 0
cts 5
cp 0
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Smoren\PartialIntersection;
6
7
class IntegerSetArrayImplementation
8
{
9
    /**
10
     * @param int $m
11
     * @param array<int> ...$sets
12
     *
13
     * @return array<int>
14
     */
15 31
    public static function partialIntersection(int $m, array ...$sets): array
16
    {
17 31
        $iterator = new \MultipleIterator(\MultipleIterator::MIT_NEED_ANY);
18
19 31
        foreach ($sets as $set) {
20 29
            $iterator->attachIterator(new \ArrayIterator($set));
21
        }
22
23 31
        $usageMap = [];
24 31
        $result = [];
25
26 31
        foreach ($iterator as $values) {
27 24
            foreach ($values as $value) {
28 24
                if ($value === null) {
29 10
                    continue;
30
                }
31
32 24
                if (!isset($usageMap[$value])) {
33 24
                    $usageMap[$value] = 0;
34
                }
35
36 24
                $usageMap[$value]++;
37
38 24
                if ($usageMap[$value] === $m) {
39 16
                    $result[] = $value;
40
                }
41
            }
42
        }
43
44 31
        sort($result);
45
46 31
        return $result;
47
    }
48
49
    /**
50
     * @param int $m
51
     * @param array<int> ...$sets
52
     *
53
     * @return array<int>
54
     */
55
    public static function partialIntersectionFunctionStyle(int $m, array ...$sets): array
56
    {
57
        $all = array_reduce($sets, fn ($carry, $set) => [...$carry, ...$set], []);
58
        $result = array_keys(array_filter(array_count_values($all), fn ($count) => $count >= $m));
59
        sort($result);
60
        return $result;
61
    }
62
63
    /**
64
     * Symmetric difference of multiple sets.
65
     *
66
     * @param array<int> ...$sets
67
     * @return array<int>
68
     */
69 1
    public static function symmetricDifference(array ...$sets): array
70
    {
71 1
        $union = array_values(array_unique(array_merge(...$sets)));
72 1
        $twoPartInt = self::partialIntersection(2, ...$sets);
73
74 1
        return array_values(array_diff($union, $twoPartInt));
75
    }
76
}
77