Arrays::searchMdObject()   A
last analyzed

Complexity

Conditions 5
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 11
rs 9.6111
c 0
b 0
f 0
cc 5
nc 1
nop 2
1
<?php
2
3
namespace DrMVC\Helpers;
4
5
/**
6
 * Class Arrays
7
 * @package DrMVC\Helpers
8
 */
9
class Arrays
10
{
11
    /**
12
     * Order array by arguments
13
     *
14
     * @return  array
15
     */
16
    public static function orderBy(): array
17
    {
18
        $args = \func_get_args();
19
        $data = array_shift($args);
20
        foreach ($args as $n => $field) {
21
            if (\is_string($field)) {
22
                $tmp = [];
23
                foreach ($data as $key => $row) {
24
                    $tmp[$key] = $row[$field];
25
                }
26
                $args[$n] = $tmp;
27
            }
28
        }
29
        $args[] = &$data;
30
        array_multisort($args);
31
        return array_pop($args);
32
    }
33
34
    /**
35
     * Check if array is multidimensional
36
     *
37
     * @param   object|array $array
38
     * @return  bool
39
     */
40
    public static function isMulti($array): bool
41
    {
42
        // If some element is array then $array is multidimensional
43
        foreach ($array as $value) {
44
            if (\is_array($value)) {
45
                return true;
46
            }
47
        }
48
        return false;
49
    }
50
51
    /**
52
     * Check if two arrays is equal, with same keys
53
     *
54
     * @param   array $a
55
     * @param   array $b
56
     * @return  bool
57
     */
58
    public static function equal(array $a, array $b): bool
59
    {
60
        // Elements count should be equal
61
        $count_equal = (\count($a) === \count($b));
62
        // Between the keys should not be differences
63
        $difference = (array_diff($a, $b) === array_diff($b, $a));
64
65
        return ($count_equal && $difference);
66
    }
67
68
    /**
69
     * Read any files and folder into some directory
70
     *
71
     * @param   string $path - Source directory with files
72
     * @return  array
73
     */
74
    public static function dirToArr($path): array
75
    {
76
        $result = [];
77
        $dirContent = scandir($path, null);
78
79
        foreach ($dirContent as $key => $value) {
80
            // Exclude system dots folders
81
            if (!\in_array($value, ['.', '..'])) {
82
                if (is_dir($path . DIRECTORY_SEPARATOR . $value)) {
83
                    $result[$value] = self::dirToArr($path . DIRECTORY_SEPARATOR . $value);
84
                } else {
85
                    $result[] = $value;
86
                }
87
            }
88
        }
89
90
        return $result;
91
    }
92
93
    /**
94
     * Make search in MD object
95
     *
96
     * @param   object $multi
97
     * @param   array $target
98
     * @return  array
99
     */
100
    private static function searchMdObject($multi, array $target): array
101
    {
102
        return array_map(
103
            function($element) use ($target) {
104
                $exist = true;
105
                foreach ($target as $skey => $svalue) {
106
                    $exist = $exist && isset($element->$skey) && ($element->$skey === $svalue);
107
                }
108
                return $exist ? $element : null;
109
            },
110
            (array) $multi
111
        );
112
    }
113
114
    /**
115
     * Make search in MD array
116
     *
117
     * @param   array $multi
118
     * @param   array $target
119
     * @return  array
120
     */
121
    private static function searchMdArray(array $multi, array $target): array
122
    {
123
        return array_map(
124
            function($element) use ($target) {
125
                $exist = true;
126
                foreach ($target as $skey => $svalue) {
127
                    $exist = $exist && isset($element[$skey]) && ($element[$skey] === $svalue);
128
                }
129
                return $exist ? $element : null;
130
            },
131
            $multi
132
        );
133
    }
134
135
    /**
136
     * Find nested array inside two-dimensional array
137
     *
138
     * TODO: Not work with objects
139
     *
140
     * @param   array|object $multi where need to make search
141
     * @param   array $target what we want to find
142
     * @return  bool|array
143
     */
144
    public static function searchMd($multi, $target)
145
    {
146
        if (empty($target) || empty($multi)) {
147
            return false;
148
        }
149
150
        $output = \is_object($multi)
151
            ? self::searchMdObject($multi, $target)
152
            : self::searchMdArray($multi, $target);
153
154
        $output = array_values(array_filter($output));
155
156
        // If output is not empty, false by default
157
        return !empty($output) ? $output : false;
158
    }
159
160
}
161