Passed
Push — master ( 222099...ff3894 )
by Saulius
01:46
created

array_flatten_value()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 6
nc 8
nop 2
dl 0
loc 12
ccs 6
cts 6
cp 1
crap 4
rs 9.2
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of the sauls/helpers package.
4
 *
5
 * @author    Saulius Vaičeliūnas <[email protected]>
6
 * @link      http://saulius.vaiceliunas.lt
7
 * @copyright 2018
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
namespace Sauls\Component\Helper;
14
15
function array_merge(... $arrays): array
16
{
17 28
    $result = \array_shift($arrays);
18 28
    while (!empty($arrays)) {
19 28
        $nextArray = \array_shift($arrays);
20 28
        foreach ($nextArray as $key => $value) {
21 16
            if (\is_int($key)) {
22 11
                if (\array_key_exists($key, $result)) {
23 11
                    $result[] = $value;
24
                } else {
25 11
                    $result[$key] = $value;
26
                }
27 7
            } elseif (\is_array($value) && isset($result[$key]) && \is_array($result[$key])) {
28 5
                $result[$key] = array_merge($result[$key], $value);
29
            } else {
30 16
                $result[$key] = $value;
31
            }
32
        }
33
    }
34
35 28
    return $result;
36
}
37
38
/**
39
 * @param mixed      $array
40
 * @param mixed      $key
41
 * @param null|mixed $default
42
 *
43
 * @return null|mixed
44
 * @throws Exception\PropertyNotAccessibleException
45
 */
46
function array_get_value($array, $key, $default = null)
47
{
48 34
    if ($key instanceof \Closure) {
49 1
        return $key($array, $default);
50
    }
51
52 33
    if (\is_array($key)) {
53 2
        $lastKey = array_pop($key);
54 2
        foreach ($key as $keyPart) {
55 2
            $array = array_get_value($array, $keyPart);
56
        }
57 2
        $key = $lastKey;
58
    }
59
60 33
    if (\is_array($array) && (isset($array[$key]) || \array_key_exists($key, $array))) {
61 28
        return $array[$key];
62
    }
63
64 9
    if ((bool)($pos = strrpos($key, '.')) !== false) {
65 4
        $array = array_get_value($array, substr($key, 0, $pos), $default);
66 4
        $key = substr($key, $pos + 1);
67
    }
68
69 9
    if (\is_object($array)) {
70 1
        return get_object_property_value($array, $key) ?? $default;
71
    }
72
73 8
    if (\is_array($array)) {
74 6
        return (isset($array[$key]) || \array_key_exists($key, $array)) ? $array[$key] : $default;
75
    }
76
77 2
    return $default;
78
}
79
80
/**
81
 * @param mixed $path
82
 * @param mixed $value
83
 *
84
 * @return mixed
85
 */
86
function array_set_value(array &$array, $path, $value)
87
{
88 7
    if ($path === null) {
89 2
        $array = $value;
90
91 2
        return;
92
    }
93 5
    $keys = \is_array($path) ? $path : \explode('.', $path);
94 5
    while (\count($keys) > 1) {
95 3
        $key = \array_shift($keys);
96
97 3
        if (!isset($array[$key])) {
98 2
            $array[$key] = [];
99
        }
100
101 3
        if (!\is_array($array[$key])) {
102 1
            $array[$key] = [$array[$key]];
103
        }
104
105 3
        $array = &$array[$key];
106
    }
107
108 5
    $array[\array_shift($keys)] = $value;
109 5
}
110
111
function array_remove_key(&$array, $key, $default = null)
112
{
113 8
    $keys = parse_array_key_path($key);
114
115 8
    while (\count($keys) > 1) {
116 4
        $key = \array_shift($keys);
117
118 4
        if (\is_array($array[$key])) {
119 4
            $array = &$array[$key];
120
        }
121
    }
122
123 8
    $key = \array_shift($keys);
124
125 8
    if (\is_array($array) && (isset($array[$key]) || \array_key_exists($key, $array))) {
126 5
        $value = $array[$key];
127 5
        unset($array[$key]);
128
129 5
        return $value;
130
    }
131
132 3
    return $default;
133
}
134
135
function array_key_exists(array $array, $key): bool
136
{
137 8
    $keys = parse_array_key_path($key);
138
139 8
    while (\count($keys) > 1) {
140 4
        $key = \array_shift($keys);
141
142 4
        if (\is_array($array[$key])) {
143 4
            $array = &$array[$key];
144
        }
145
    }
146
147 8
    $key = \array_shift($keys);
148
149 8
    return isset($array[$key]) || \array_key_exists($key, $array);
150
}
151
152
/**
153
 * @param mixed|string|array $key
154
 */
155
function parse_array_key_path($key): array
156
{
157 16
    return \is_array($key) ? $key : \explode('.', $key);
158
}
159
160
function array_remove_value(&$array, $value): array
161
{
162 3
    $result = [];
163 3
    if (\is_array($array)) {
164 3
        foreach ($array as $key => $val) {
165 2
            if ($val === $value) {
166 2
                $result[$key] = $val;
167 2
                unset($array[$key]);
168
            }
169
        }
170
    }
171
172 3
    return $result;
173
}
174
175
function array_deep_search(array $array, $searchValue)
176
{
177 8
    $result = [];
178 8
    foreach ($array as $key => $value) {
179 6
        if ($path = array_deep_search_value($key, $value, $searchValue)) {
180 6
            $result[] = $path;
181
        }
182
    }
183
184 8
    return $result;
185
}
186
187
function array_deep_search_value($key, $value, $searchValue, $path = [])
188
{
189 7
    if (\is_array($value) && $subPath = array_deep_search($value, $searchValue)) {
190 4
        return array_flatten(array_merge($path, [$key], $subPath));
191
    }
192
193 7
    if ($value === $searchValue) {
194 5
        return [$key];
195
    }
196
197 7
    return [];
198
}
199
200
/**
201
 * @throws \RuntimeException
202
 */
203
function array_flatten(array $array): array
204
{
205
    try {
206 9
        $result = [];
207 9
        foreach (\array_keys($array) as $key) {
208 8
            array_flatten_value($array[$key], $result);
209
        }
210 8
        return \array_values(\array_unique($result));
211 1
    } catch (\Throwable $t) {
212 1
        throw new \RuntimeException($t->getMessage());
213
    }
214
}
215
216
/**
217
 * @param mixed $value
218
 */
219
function array_flatten_value($value, array &$result): void
220
{
221 8
    if (\is_scalar($value)) {
222 8
        $result[] = $value;
223
    }
224
225 8
    if (\is_array($value)) {
226 6
        $result = array_merge($result, array_flatten($value));
227
    }
228
229 8
    if (\is_object($value)) {
230 2
        $result[] = (string)$value;
231
    }
232 8
}
233
234
function array_multiple_keys_exists(array $array, array $keys): bool
235
{
236 1
    if (empty($keys)) {
237 1
        return false;
238
    }
239
240 1
    $result = true;
241
242 1
    foreach ($keys as $key) {
243 1
        $result &= array_key_exists($array, $key);
244
    }
245
246 1
    return $result ? true : false;
247
}
248