Passed
Push — master ( 03179d...66acfb )
by Richard
01:36
created

ArrayFilter::isInArraySearch()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 1
c 0
b 0
f 0
nc 3
nop 3
dl 0
loc 2
rs 10
1
<?php
2
namespace Maphper\Lib;
3
use Maphper\Maphper;
4
5
class ArrayFilter {
6
    private $array;
7
8
    public function __construct(array $array) {
9
        $this->array = $array;
10
    }
11
12
    public function filter($fields) {
13
        $filteredArray = array_filter($this->array, $this->getSearchFieldFunction($fields, \Maphper\Maphper::FIND_EXACT | \Maphper\Maphper::FIND_AND));
14
        // Need to reset indexes
15
        $filteredArray = array_values($filteredArray);
16
        return $filteredArray;
17
    }
18
19
    private function getSearchFieldFunction($fields, $mode) {
20
        return function ($data) use ($fields, $mode) {
21
            foreach ($fields as $key => $val) {
22
                $currentFieldResult = $this->getIfFieldMatches($key, $val, $data, $mode);
23
24
                if (Maphper::FIND_OR & $mode && $currentFieldResult === true) return true;
25
                else if (Maphper::FIND_OR ^ $mode && $currentFieldResult === false) return false;
26
            }
27
            return (bool)(Maphper::FIND_OR ^ $mode);
28
        };
29
    }
30
31
    private function getIfFieldMatches($key, $val, $data, $mode) {
32
        if ($this->shouldRunDeepSearch($key, $val)) {
33
            return $this->getSearchFieldFunction($val, $key)($data);
34
        }
35
        else if (!isset($data->$key)) return false;
36
        else if ($this->isInArraySearch($mode, $key, $val))
37
            return in_array($data->$key, $val);
38
        else
39
            return $this->processFilter($mode, $val, $data->$key);
40
    }
41
42
    private function shouldRunDeepSearch($key, $val) {
43
        return is_numeric($key) && is_array($val);
44
    }
45
46
    private function isInArraySearch($mode, $key, $val) {
47
        return !(Maphper::FIND_BETWEEN & $mode) && !is_numeric($key) && is_array($val);
48
    }
49
50
    private function processFilter($mode, $expected, $actual) {
51
        if (Maphper::FIND_NOT & $mode) return $expected != $actual;
52
        else if ((Maphper::FIND_GREATER | Maphper::FIND_EXACT) === $mode) return $expected <= $actual;
53
        else if ((Maphper::FIND_LESS | Maphper::FIND_EXACT) === $mode) return $expected >= $actual;
54
        else if (Maphper::FIND_GREATER & $mode) return $expected < $actual;
55
        else if (Maphper::FIND_LESS & $mode) return $expected > $actual;
56
        else if (Maphper::FIND_BETWEEN & $mode) return $expected[0] <= $actual && $actual <= $expected[1];
57
        else if (Maphper::FIND_NOCASE & $mode) return strtolower($expected) == strtolower($actual);
58
        return $expected == $actual;
59
    }
60
}
61