forked from codeigniter4/CodeIgniter4
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patharray_helper.php
More file actions
231 lines (204 loc) · 6.81 KB
/
array_helper.php
File metadata and controls
231 lines (204 loc) · 6.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<?php
declare(strict_types=1);
/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <[email protected]>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
use CodeIgniter\Helpers\Array\ArrayHelper;
// CodeIgniter Array Helpers
if (! function_exists('dot_array_search')) {
/**
* Searches an array through dot syntax. Supports
* wildcard searches, like foo.*.bar
*
* @return array|bool|int|object|string|null
*/
function dot_array_search(string $index, array $array)
{
return ArrayHelper::dotSearch($index, $array);
}
}
if (! function_exists('dot_array_has')) {
/**
* Checks if an array key exists using dot syntax.
*
* @param array<array-key, mixed> $array
*/
function dot_array_has(string $index, array $array): bool
{
return ArrayHelper::dotHas($index, $array);
}
}
if (! function_exists('dot_array_set')) {
/**
* Sets an array value using dot syntax.
*
* @param array<array-key, mixed> $array
*/
function dot_array_set(array &$array, string $index, mixed $value): void
{
ArrayHelper::dotSet($array, $index, $value);
}
}
if (! function_exists('dot_array_unset')) {
/**
* Unsets an array value using dot syntax.
*
* @param array<array-key, mixed> $array
*/
function dot_array_unset(array &$array, string $index): bool
{
return ArrayHelper::dotUnset($array, $index);
}
}
if (! function_exists('dot_array_only')) {
/**
* Gets only the specified keys using dot syntax.
*
* @param array<array-key, mixed> $array
* @param list<string>|string $indexes
*
* @return array<array-key, mixed>
*/
function dot_array_only(array $array, array|string $indexes): array
{
return ArrayHelper::dotOnly($array, $indexes);
}
}
if (! function_exists('dot_array_except')) {
/**
* Gets all keys except the specified ones using dot syntax.
*
* @param array<array-key, mixed> $array
* @param list<string>|string $indexes
*
* @return array<array-key, mixed>
*/
function dot_array_except(array $array, array|string $indexes): array
{
return ArrayHelper::dotExcept($array, $indexes);
}
}
if (! function_exists('array_deep_search')) {
/**
* Returns the value of an element at a key in an array of uncertain depth.
*
* @param int|string $key
*
* @return array|bool|float|int|object|string|null
*/
function array_deep_search($key, array $array)
{
if (isset($array[$key])) {
return $array[$key];
}
foreach ($array as $value) {
if (is_array($value) && ($result = array_deep_search($key, $value))) {
return $result;
}
}
return null;
}
}
if (! function_exists('array_sort_by_multiple_keys')) {
/**
* Sorts a multidimensional array by its elements values. The array
* columns to be used for sorting are passed as an associative
* array of key names and sorting flags.
*
* Both arrays of objects and arrays of array can be sorted.
*
* Example:
* array_sort_by_multiple_keys($players, [
* 'team.hierarchy' => SORT_ASC,
* 'position' => SORT_ASC,
* 'name' => SORT_STRING,
* ]);
*
* The '.' dot operator in the column name indicates a deeper array or
* object level. In principle, any number of sublevels could be used,
* as long as the level and column exist in every array element.
*
* For information on multi-level array sorting, refer to Example #3 here:
* https://www.php.net/manual/de/function.array-multisort.php
*
* @param array $array the reference of the array to be sorted
* @param array $sortColumns an associative array of columns to sort
* after and their sorting flags
*/
function array_sort_by_multiple_keys(array &$array, array $sortColumns): bool
{
// Check if there really are columns to sort after
if ($sortColumns === [] || $array === []) {
return false;
}
// Group sorting indexes and data
$tempArray = [];
foreach ($sortColumns as $key => $sortFlag) {
// Get sorting values
$carry = $array;
// The '.' operator separates nested elements
foreach (explode('.', $key) as $keySegment) {
// Loop elements if they are objects
if (is_object(reset($carry))) {
// Extract the object attribute
foreach ($carry as $index => $object) {
$carry[$index] = $object->{$keySegment};
}
continue;
}
// Extract the target column if elements are arrays
$carry = array_column($carry, $keySegment);
}
// Store the collected sorting parameters
$tempArray[] = $carry;
$tempArray[] = $sortFlag;
}
// Append the array as reference
$tempArray[] = &$array;
// Pass sorting arrays and flags as an argument list.
return array_multisort(...$tempArray);
}
}
if (! function_exists('array_flatten_with_dots')) {
/**
* Flatten a multidimensional array using dots as separators.
*
* @param iterable $array The multi-dimensional array
* @param string $id Something to initially prepend to the flattened keys
*
* @return array The flattened array
*/
function array_flatten_with_dots(iterable $array, string $id = ''): array
{
$flattened = [];
foreach ($array as $key => $value) {
$newKey = $id . $key;
if (is_array($value) && $value !== []) {
$flattened = array_merge($flattened, array_flatten_with_dots($value, $newKey . '.'));
} else {
$flattened[$newKey] = $value;
}
}
return $flattened;
}
}
if (! function_exists('array_group_by')) {
/**
* Groups all rows by their index values. Result's depth equals number of indexes
*
* @param array $array Data array (i.e. from query result)
* @param array $indexes Indexes to group by. Dot syntax used. Returns $array if empty
* @param bool $includeEmpty If true, null and '' are also added as valid keys to group
*
* @return array Result array where rows are grouped together by indexes values.
*/
function array_group_by(array $array, array $indexes, bool $includeEmpty = false): array
{
return ArrayHelper::groupBy($array, $indexes, $includeEmpty);
}
}