Passed
Push — master ( 02cf1a...e288dc )
by Richard
01:43
created

ArrayFilter   A

Complexity

Total Complexity 26

Size/Duplication

Total Lines 46
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 46
rs 10
c 0
b 0
f 0
wmc 26

5 Methods

Rating   Name   Duplication   Size   Complexity  
B processFilter() 0 9 11
A filter() 0 5 1
B getIfFieldMatches() 0 9 7
A __construct() 0 2 1
B getSearchFieldFunction() 0 9 6
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 !(Maphper::FIND_OR & $mode);
28
        };
29
    }
30
31
    private function getIfFieldMatches($key, $val, $data, $mode) {
32
        if (is_numeric($key) && is_array($val)) {
33
            return $this->getSearchFieldFunction($val, $key)($data);
34
        }
35
        else if (!isset($data->$key)) return false;
36
        else if (!(Maphper::FIND_BETWEEN & $mode) && !is_numeric($key) && is_array($val))
37
            return in_array($data->$key, $val);
38
        else
39
            return $this->processFilter($mode, $val, $data->$key);
40
    }
41
42
    private function processFilter($mode, $expected, $actual) {
43
        if (Maphper::FIND_NOT & $mode) return $expected != $actual;
44
        else if (Maphper::FIND_GREATER & $mode && Maphper::FIND_EXACT & $mode) return $expected <= $actual;
45
        else if (Maphper::FIND_LESS & $mode && Maphper::FIND_EXACT & $mode) return $expected >= $actual;
46
        else if (Maphper::FIND_GREATER & $mode) return $expected < $actual;
47
        else if (Maphper::FIND_LESS & $mode) return $expected > $actual;
48
        else if (Maphper::FIND_BETWEEN & $mode) return $expected[0] <= $actual && $actual <= $expected[1];
49
        else if (Maphper::FIND_NOCASE & $mode) return strtolower($expected) == strtolower($actual);
50
        return $expected == $actual;
51
    }
52
}
53