Passed
Pull Request — main (#22)
by Andrey
11:55
created

Arr::get()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 1
c 1
b 0
f 0
nc 2
nop 3
dl 0
loc 4
rs 10
1
<?php
2
3
namespace Helldar\Support\Helpers;
4
5
use ArrayAccess;
6
7
class Arr
8
{
9
    /**
10
     * Renaming array keys.
11
     * As the second parameter, a callback function is passed, which determines the actions for processing the value.
12
     * The output of the function must be a string with a name.
13
     *
14
     * @param  array  $array
15
     * @param  callable  $callback
16
     *
17
     * @return array
18
     */
19
    public function renameKeys(array $array, callable $callback): array
20
    {
21
        $result = [];
22
23
        foreach ($array as $key => $value) {
24
            $new = $callback($key, $value);
25
26
            $result[$new] = $value;
27
        }
28
29
        return $result;
30
    }
31
32
    /**
33
     * Renaming array keys with map.
34
     *
35
     * @param  array  $array
36
     * @param  array  $map
37
     *
38
     * @return array
39
     */
40
    public function renameKeysMap(array $array, array $map): array
41
    {
42
        return $this->renameKeys($array, static function ($key) use ($map) {
43
            return $map[$key] ?? $key;
44
        });
45
    }
46
47
    /**
48
     * Get the size of the longest text element of the array.
49
     *
50
     * @param  array  $array
51
     *
52
     * @return int
53
     */
54
    public function longestStringLength(array $array): int
55
    {
56
        return ! empty($array)
57
            ? max(array_map('mb_strlen', $array))
58
            : 0;
59
    }
60
61
    /**
62
     * Push one a unique element onto the end of array.
63
     *
64
     * @param  array  $array
65
     * @param  array|mixed  $values
66
     *
67
     * @return array
68
     */
69
    public function flatten(array $array, $values): array
70
    {
71
        if ($this->isArrayable($values)) {
72
            foreach ($values as $value) {
73
                $array = $this->flatten($array, $value);
74
            }
75
        } else {
76
            array_push($array, $values);
77
        }
78
79
        return array_values(array_unique($array));
80
    }
81
82
    /**
83
     * Sort an associative array in the order specified by an array of keys.
84
     *
85
     * Example:
86
     *
87
     *  $arr = ['q' => 1, 'r' => 2, 's' => 5, 'w' => 123];
88
     *
89
     *  Arr::sortByKeys($arr, ['q', 'w', 'e']);
90
     *
91
     * print_r($arr);
92
     *
93
     *   Array
94
     *   (
95
     *     [q] => 1
96
     *     [w] => 123
97
     *     [r] => 2
98
     *     [s] => 5
99
     *   )
100
     *
101
     * @see https://gist.github.com/Ellrion/a3145621f936aa9416f4c04987533d8d#file-helper-php
102
     *
103
     * @param  array  $array
104
     * @param  array  $sorter
105
     *
106
     * @return array
107
     */
108
    public function sortByKeys(array $array, array $sorter): array
109
    {
110
        $sorter = array_intersect($sorter, array_keys($array));
111
        $array  = array_merge(array_flip($sorter), $array);
112
113
        return $array;
114
    }
115
116
    /**
117
     * Merge one or more arrays recursively.
118
     * Don't forget that numeric keys NOT will be renumbered!
119
     *
120
     * @param  array[]  ...$arrays
121
     *
122
     * @return array
123
     */
124
    public function merge(...$arrays): array
125
    {
126
        $result = [];
127
128
        foreach ($arrays as $array) {
129
            foreach ($array as $key => $value) {
130
                if (is_array($value)) {
131
                    $value = $this->merge($result[$key] ?? [], $value);
132
                }
133
134
                $result[$key] = $value;
135
            }
136
        }
137
138
        return $result;
139
    }
140
141
    public function wrap($value = null): array
142
    {
143
        return is_array($value) ? $value : [$value];
144
    }
145
146
    public function toArray($value = null): array
147
    {
148
        if (is_object($value)) {
149
            $value = method_exists($value, 'toArray') ? $value->toArray() : get_object_vars($value);
150
        }
151
152
        $array = $this->wrap($value);
153
154
        foreach ($array as &$item) {
155
            $item = $this->isArrayable($item) ? $this->toArray($item) : $item;
156
        }
157
158
        return $array;
159
    }
160
161
    public function exists(array $array, $key): bool
162
    {
163
        return $array instanceof ArrayAccess
0 ignored issues
show
introduced by
$array is never a sub-type of ArrayAccess.
Loading history...
164
            ? $array->offsetExists($key)
165
            : isset($array[$key]);
166
    }
167
168
    public function get(array $array, $key, $default = null)
169
    {
170
        // TODO: $array[$key] ?? $default;
171
        return $this->exists($array, $key) ? $array[$key] : $default;
172
    }
173
174
    public function except(array $array, $keys): array
175
    {
176
        $keys = (array) $keys;
177
178
        return array_filter($array, static function ($key) use ($keys) {
179
            return ! empty($keys) && ! in_array($key, $keys);
180
        }, ARRAY_FILTER_USE_KEY);
181
    }
182
183
    /**
184
     * Get a subset of the items from the given array.
185
     *
186
     * @param  array  $array
187
     * @param  array|string  $keys
188
     *
189
     * @return array
190
     */
191
    public function only(array $array, $keys): array
192
    {
193
        return array_intersect_key($array, array_flip((array) $keys));
194
    }
195
196
    public function map(array $array, callable $callback): array
197
    {
198
        return array_map($callback, $array);
199
    }
200
201
    public function isArrayable($value = null): bool
202
    {
203
        return is_array($value) || is_object($value) || $value instanceof ArrayAccess;
204
    }
205
}
206