Completed
Branch master (db83f9)
by Arnold
03:38
created

array_contains_any_assoc()   B

Complexity

Conditions 7
Paths 4

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 7

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 10
nc 4
nop 3
dl 0
loc 19
rs 8.8333
c 1
b 0
f 0
ccs 10
cts 10
cp 1
crap 7
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Jasny;
6
7
/**
8
 * Return an array with only the specified keys.
9
 *
10
 * @param array          $array
11
 * @param string[]|int[] $keys
12
 * @return array
13
 */
14
function array_only(array $array, array $keys): array
15
{
16 1
    $intersect = array_fill_keys($keys, null);
17 1
    return array_intersect_key($array, $intersect);
18
}
19
20
/**
21
 * Return an array without the specified keys.
22
 *
23
 * @param array          $array
24
 * @param string[]|int[] $keys
25
 * @return array
26
 */
27
function array_without(array $array, array $keys): array
28
{
29 1
    $intersect = array_fill_keys($keys, null);
30 1
    return array_diff_key($array, $intersect);
31
}
32
33
/**
34
 * Check if an array contains all values in a set.
35
 *
36
 * @param array $array
37
 * @param array $subset
38
 * @param bool  $strict  Strict type checking
39
 * @return bool
40
 */
41
function array_contains_all(array $array, array $subset, bool $strict = false)
42
{
43 4
    $contains = true;
44
45 4
    foreach ($subset as $value) {
46 3
        if (!in_array($value, $array, $strict)) {
47 3
            $contains = false;
48 3
            break;
49
        }
50
    }
51
    
52 4
    return $contains;
53
}
54
55
/**
56
 * Check if an array contains all values in a set with index check.
57
 *
58
 * @param array $array
59
 * @param array $subset
60
 * @param bool  $strict  Strict type checking
61
 * @return bool
62
 */
63
function array_contains_all_assoc(array $array, array $subset, bool $strict = false): bool
64
{
65 5
    if (count(array_diff_key($subset, $array)) > 0) { // Quick test, just on keys
66 1
        return false;
67
    }
68
69 4
    $contains = true;
70
71 4
    foreach ($subset as $key => $value) {
72 3
        if (!array_key_exists($key, $array) ||
73 3
            isset($value) !== isset($array[$key]) ||
74 3
            ($strict ? $value !== $array[$key] : $value != $array[$key])
75
        ) {
76 3
            $contains = false;
77
        }
78
    }
79
    
80 4
    return $contains;
81
}
82
83
/**
84
 * Check if an array contains any value in a set.
85
 **
86
 * @param array $array
87
 * @param array $subset
88
 * @param bool  $strict  Strict type checking
89
 * @return bool
90
 */
91
function array_contains_any(array $array, array $subset, bool $strict = false): bool
92
{
93 4
    $contains = false;
94
95 4
    foreach ($subset as $value) {
96 3
        if (in_array($value, $array, $strict)) {
97 3
            $contains = true;
98 3
            break;
99
        }
100
    }
101
102 4
    return $contains;
103
}
104
105
/**
106
 * Check if an array contains any value in a set with index check.
107
 *
108
 * @param array $array
109
 * @param array $subset
110
 * @param bool  $strict  Strict type checking
111
 * @return bool
112
 */
113
function array_contains_any_assoc(array $array, array $subset, bool $strict = false): bool
114
{
115 4
    if (count(array_intersect_key($subset, $array)) === 0) { // Quick test, just on keys
116 1
        return false;
117
    }
118
119 3
    $contains = false;
120
121 3
    foreach ($subset as $key => $value) {
122 3
        if (array_key_exists($key, $array) &&
123 3
            isset($value) === isset($array[$key]) &&
124 3
            ($strict ? $value === $array[$key] : $value == $array[$key])
125
        ) {
126 3
            $contains = true;
127 3
            break;
128
        }
129
    }
130
131 3
    return $contains;
132
}
133
134
135
/**
136
 * Find an element of an array using a callback function.
137
 * @see array_filter()
138
 *
139
 * Returns the value or FALSE if no element was found.
140
     *
141
 * @param array    $array
142
 * @param callable $callback
143
 * @param int      $flag      Flag determining what arguments are sent to callback
144
 * @return mixed|false
145
 */
146
function array_find(array $array, callable $callback, int $flag = 0)
147
{
148 4
    foreach ($array as $key => $value) {
149 4
        $args = $flag === ARRAY_FILTER_USE_BOTH ? [$key, $value] :
150 4
            ($flag === ARRAY_FILTER_USE_KEY ? [$key] : [$value]);
151
152 4
        if ($callback(...$args)) {
153 4
            return $value;
154
        }
155
    }
156
157 1
    return false;
158
}
159
160
/**
161
 * Find a key of an array using a callback function.
162
 * @see array_filter()
163
 *
164
 * Returns the key or FALSE if no element was found.
165
 *
166
 * @param array    $array
167
 * @param callable $callback
168
 * @param int      $flag      Flag determining what arguments are sent to callback
169
 * @return string|int|false
170
 */
171
function array_find_key(array $array, callable $callback, int $flag = 0)
172
{
173 4
    foreach ($array as $key => $value) {
174 4
        $args = $flag === ARRAY_FILTER_USE_BOTH ? [$key, $value] :
175 4
            ($flag === ARRAY_FILTER_USE_KEY ? [$key] : [$value]);
176
177 4
        if ($callback(...$args)) {
178 4
            return $key;
179
        }
180
    }
181
182 1
    return false;
183
}
184
185
186
/**
187
 * Flatten a nested associative array, concatenating the keys.
188
 *
189
 * @param array  $array
190
 * @param string $glue
191
 * @return array
192
 */
193
function array_flatten(array $array, string $glue = '.'): array
194
{
195 3
    foreach ($array as $key => &$value) {
196 3
        if (!is_associative_array($value)) {
197 3
            continue;
198
        }
199
200 3
        unset($array[$key]);
201 3
        $value = array_flatten($value, $glue);
202
203 3
        foreach ($value as $subkey => $subvalue) {
204 3
            $array[$key . $glue . $subkey] = $subvalue;
205
        }
206
    }
207
    
208 3
    return $array;
209
}
210
211
/**
212
 * Join an array, using the 'and' parameter as glue the last two items.
213
 *
214
 * @param string $glue
215
 * @param string $and
216
 * @param array  $array
217
 * @return string
218
 */
219
function array_join_pretty(string $glue, string $and, array $array): string
220
{
221 5
    $last = (string)array_pop($array);
222
    
223 5
    return (count($array) === 0 ? "" : join($glue, $array) . $and) . $last;
224
}
225