Arr::valuesWithType()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 8
cts 8
cp 1
rs 9.8333
c 0
b 0
f 0
cc 3
nc 3
nop 2
crap 3
1
<?php declare(strict_types=1);
2
/**
3
 * Utils.
4
 *
5
 * @copyright Copyright (c) 2016 Starweb AB
6
 * @license   BSD 3-Clause
7
 */
8
9
namespace Starlit\Utils;
10
11
class Arr
12
{
13
    /**
14
     * If any of the provided values is in an array.
15
     *
16
     * This is a convenient function for constructs like in_array('val1', $a) || in_array('val2, $a) etc.
17
     *
18
     * @param array|string $anyValue Array of needles (will try any for a match)
19
     * @param array        $array    Haystack array
20
     * @return bool
21
     */
22 2
    public static function anyIn($anyValue, array $array): bool
23
    {
24 2
        if (is_array($anyValue)) {
25 2
            return (bool) array_intersect($anyValue, $array);
26
        }
27
28 2
        return in_array($anyValue, $array);
29
    }
30
31
    /**
32
     * If all of the provided values is in an array.
33
     *
34
     * This is a convenient function for constructs like in_array('val1', $a) && in_array('val2, $a) etc.
35
     *
36
     * @param array|mixed $allValues Array of needles (will try all for a match)
37
     * @param array       $array     Haystack array
38
     * @return bool
39
     */
40 2
    public static function allIn($allValues, array $array): bool
41
    {
42 2
        if (is_array($allValues)) {
43 2
            if (empty($allValues)) {
44 1
                return false;
45
            }
46
47 2
            foreach ($allValues as $value) {
48 2
                if (!in_array($value, $array)) {
49 2
                    return false;
50
                }
51
            }
52
53
            // A match was found for all values if we got here
54 1
            return true;
55
        }
56
57 1
        return in_array($allValues, $array);
58
    }
59
60
    /**
61
     * Get a new array with prefix applied to all values.
62
     *
63
     * @param array  $array
64
     * @param string $prefix
65
     * @return array
66
     */
67 1
    public static function valuesWithPrefix(array $array, $prefix): array
68
    {
69 1
        $newArray = [];
70 1
        foreach ($array as $oldValue) {
71 1
            $newArray[] = $prefix . $oldValue;
72
        }
73
74
75 1
        return $newArray;
76
    }
77
78
    /**
79
     * Checks if all values in an array is empty (recursively).
80
     *
81
     * Does not consider other arrays with empty values non-empty as the normal
82
     * empty() function does.
83
     *
84
     * @param array|mixed $input
85
     * @return bool
86
     */
87 2
    public static function allEmpty($input): bool
88
    {
89 2
        if (is_array($input)) {
90 2
            foreach ($input as $value) {
91 2
                if (!self::allEmpty($value)) {
92 1
                    return false;
93
                }
94
            }
95
96 1
            return true;
97
        } else {
98 2
            return empty($input);
99
        }
100
    }
101
102
    /**
103
     * Filter associative array on keys, by provided keys, a callable or null (like  array_filter, but for keys).
104
     *
105
     * @param array               $inputArray
106
     * @param array|callable|null $keysOrCallable
107
     * @return array
108
     */
109 3
    public static function filterKeys(array $inputArray, $keysOrCallable = null): array
110
    {
111
        // Get keys
112 3
        if (is_array($keysOrCallable)) {
113 1
            $filteredKeys = $keysOrCallable;
114 2
        } elseif (is_callable($keysOrCallable)) {
115 1
            $filteredKeys = array_filter(array_keys($inputArray), $keysOrCallable);
116
        } else {
117 1
            $filteredKeys = array_filter(array_keys($inputArray));
118
        }
119
120
        // Return associative array with only the the filtered keys
121 3
        return array_intersect_key($inputArray, array_flip($filteredKeys));
122
    }
123
124
    /**
125
     * Collect values from method calls from an array of objects.
126
     *
127
     * @param array  $objectArray
128
     * @param string $methodName
129
     * @return array
130
     */
131 1
    public static function objectsMethodValues(array $objectArray, string $methodName): array
132
    {
133 1
        $methodValues = [];
134
135 1
        foreach ($objectArray as $object) {
136 1
            $methodValues[] = $object->$methodName();
137
        }
138
139 1
        return $methodValues;
140
    }
141
142
    /**
143
     * Get a new array with all scalar values cast to type.
144
     *
145
     * @param array  $inputArray
146
     * @param string $type
147
     * @return array
148
     */
149 2
    public static function valuesWithType(array $inputArray, string $type): array
150
    {
151 2
        $newArray = [];
152 2
        foreach ($inputArray as $key => $value) {
153 2
            if (is_scalar($value)) {
154 1
                $newValue = $value;
155 1
                settype($newValue, $type);
156 1
                $newArray[$key] = $newValue;
157
            }
158
        }
159
160 2
        return $newArray;
161
    }
162
163
    /**
164
     * Replaces values in array1 with values from array2 comparing keys and
165
     * discarding keys that doesn't exist in array1.
166
     *
167
     * @param array $array1
168
     * @param array $array2
169
     * @param bool  $recursive
170
     * @return array
171
     */
172 3
    public static function replaceExisting(array $array1, array $array2, bool $recursive = false): array
173
    {
174 3
        foreach ($array1 as $key => $value) {
175 3
            if (array_key_exists($key, $array2)) {
176 3
                $value2 = $array2[$key];
177 3
                if ($recursive && is_array($value)) {
178 1
                    $value2 = self::replaceExisting($value, $value2, $recursive);
179
                }
180 3
                $array1[$key] = $value2;
181
            }
182
        }
183
184 3
        return $array1;
185
    }
186
187
    /**
188
     * Sort by array.
189
     *
190
     * @param array $sortArray
191
     * @param array $mapArray
192
     * @return array
193
     */
194 1
    public static function sortByArray(array $sortArray, array $mapArray): array
195
    {
196 1
        $sortedArray = [];
197 1
        foreach ((array) $mapArray as $id) {
198 1
            if (array_key_exists($id, $sortArray)) {
199 1
                $sortedArray[] = $sortArray[$id];
200
            }
201
        }
202
203 1
        return $sortedArray;
204
    }
205
}
206