Completed
Push — master ( 3eb3fa...222099 )
by Saulius
02:58
created

array_flatten()   A

Complexity

Conditions 3
Paths 7

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 7
nop 1
dl 0
loc 10
ccs 6
cts 6
cp 1
crap 3
rs 9.4285
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
 */
45
function array_get_value($array, $key, $default = null)
46
{
47 34
    if ($key instanceof \Closure) {
48 1
        return $key($array, $default);
49
    }
50
51 33
    if (\is_array($key)) {
52 2
        $lastKey = array_pop($key);
53 2
        foreach ($key as $keyPart) {
54 2
            $array = array_get_value($array, $keyPart);
55
        }
56 2
        $key = $lastKey;
57
    }
58
59 33
    if (\is_array($array) && (isset($array[$key]) || \array_key_exists($key, $array))) {
60 28
        return $array[$key];
61
    }
62
63 9
    if ((bool)($pos = strrpos($key, '.')) !== false) {
64 4
        $array = array_get_value($array, substr($key, 0, $pos), $default);
65 4
        $key = substr($key, $pos + 1);
66
    }
67
68 9
    if (\is_object($array)) {
69 1
        return get_object_property_value($array, $key) ?? $default;
70
    }
71
72 8
    if (\is_array($array)) {
73 6
        return (isset($array[$key]) || \array_key_exists($key, $array)) ? $array[$key] : $default;
74
    }
75
76 2
    return $default;
77
}
78
79
/**
80
 * @param mixed $path
81
 * @param mixed $value
82
 *
83
 * @return mixed
84
 */
85
function array_set_value(array &$array, $path, $value)
86
{
87 7
    if ($path === null) {
88 2
        $array = $value;
89
90 2
        return;
91
    }
92 5
    $keys = \is_array($path) ? $path : \explode('.', $path);
93 5
    while (\count($keys) > 1) {
94 3
        $key = \array_shift($keys);
95
96 3
        if (!isset($array[$key])) {
97 2
            $array[$key] = [];
98
        }
99
100 3
        if (!\is_array($array[$key])) {
101 1
            $array[$key] = [$array[$key]];
102
        }
103
104 3
        $array = &$array[$key];
105
    }
106
107 5
    $array[\array_shift($keys)] = $value;
108 5
}
109
110
function array_remove_key(&$array, $key, $default = null)
111
{
112 8
    $keys = \is_array($key) ? $key : \explode('.', $key);
113
114 8
    while (\count($keys) > 1) {
115 4
        $key = \array_shift($keys);
116
117 4
        if (\is_array($array[$key])) {
118 4
            $array = &$array[$key];
119
        }
120
    }
121
122 8
    $key = \array_shift($keys);
123
124 8
    if (\is_array($array) && (isset($array[$key]) || \array_key_exists($key, $array))) {
125 5
        $value = $array[$key];
126 5
        unset($array[$key]);
127
128 5
        return $value;
129
    }
130
131 3
    return $default;
132
}
133
134
function array_remove_value(&$array, $value): array
135
{
136 3
    $result = [];
137 3
    if (\is_array($array)) {
138 3
        foreach ($array as $key => $val) {
139 2
            if ($val === $value) {
140 2
                $result[$key] = $val;
141 2
                unset($array[$key]);
142
            }
143
        }
144
    }
145
146 3
    return $result;
147
}
148
149
function array_key_exists(array $array, $key): bool
150
{
151 8
    $keys = \is_array($key) ? $key : \explode('.', $key);
152
153 8
    while (\count($keys) > 1) {
154 4
        $key = \array_shift($keys);
155
156 4
        if (\is_array($array[$key])) {
157 4
            $array = &$array[$key];
158
        }
159
    }
160
161 8
    $key = \array_shift($keys);
162
163 8
    return isset($array[$key]) || \array_key_exists($key, $array);
164
165
}
166
167
function array_deep_search(array $array, $searchValue)
168
{
169 8
    $result = [];
170 8
    foreach ($array as $key => $value) {
171 6
        if ($path = array_deep_search_value($key, $value, $searchValue)) {
172 6
            $result[] = $path;
173
        }
174
    }
175
176 8
    return $result;
177
}
178
179
function array_deep_search_value($key, $value, $searchValue, $path = [])
180
{
181 7
    if (\is_array($value) && $subPath = array_deep_search($value, $searchValue)) {
182 4
        return array_flatten(array_merge($path, [$key], $subPath));
183
    }
184
185 7
    if ($value === $searchValue) {
186 5
        return [$key];
187
    }
188
189 7
    return [];
190
}
191
192
/**
193
 * @throws \RuntimeException
194
 */
195
function array_flatten(array $array): array
196
{
197
    try {
198 9
        $result = [];
199 9
        foreach (\array_keys($array) as $key) {
200 8
            array_flatten_assign_value_by_element_type($array[$key], $result);
201
        }
202 8
        return \array_values(\array_unique($result));
203 1
    } catch (\Throwable $t) {
204 1
        throw new \RuntimeException($t->getMessage());
205
    }
206
}
207
208
/**
209
 * @param mixed $value
210
 */
211
function array_flatten_assign_value_by_element_type($value, array &$result): void
212
{
213 8
    if (\is_scalar($value)) {
214 8
        $result[] = $value;
215
    }
216
217 8
    if (\is_array($value)) {
218 6
        $result = array_merge($result, array_flatten($value));
219
    }
220
221 8
    if (\is_object($value)) {
222 2
        $result[] = (string)$value;
223
    }
224 8
}
225
226
function array_multiple_keys_exists(array $array, array $keys): bool
227
{
228 1
    if (empty($keys)) {
229 1
        return false;
230
    }
231
232 1
    $result = true;
233
234 1
    foreach ($keys as $key) {
235 1
        $result &= array_key_exists($array, $key);
236
    }
237
238 1
    return $result ? true : false;
239
}
240