Completed
Push — master ( dfe707...c47543 )
by Agel_Nash
05:02 queued 12s
created

rename_key_array()   C

Complexity

Conditions 12
Paths 33

Size

Total Lines 28
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 12.018

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 12
eloc 21
c 2
b 0
f 0
nc 33
nop 5
dl 0
loc 28
ccs 19
cts 20
cp 0.95
crap 12.018
rs 5.1612

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
if (! function_exists('for_all')) {
3
    /**
4
     * Применение callback функции к каждому элементу массива, который является строкой или просто строке
5
     * Всем переменным не являющимися массивом или строкой, будет присвоено значение null
6
     *
7
     * @param  mixed $data Строка или массив с данными
8
     * @param  Closure $callback callback функция
9
     * @return mixed
10
     */
11
    function for_all($data, Closure $callback)
12
    {
13
        switch (true) {
14 18
            case is_array($data):
15
                foreach ($data as &$val) {
16
                    $val = for_all($val, $callback);
17
                }
18
                break;
19 18
            case is_scalar($data):
20 18
                $data = $callback($data);
21 18
                break;
22
            default:
23
                $data = null;
24
        }
25
26 18
        return $data;
27
    }
28
}
29
30
if (! function_exists('get_key')) {
31
    /**
32
     * Получение значения по ключу из массива, либо возврат значения по умолчанию
33
     *
34
     * @param mixed $data массив
35
     * @param string $key ключ массива
36
     * @param mixed $default null значение по умолчанию
37
     * @param Closure $validate null функция дополнительной валидации значения (должна возвращать true или false)
38
     * @return mixed
39
     */
40
    function get_key($data, $key, $default = null, $validate = null)
41
    {
42 5
        $out = $default;
43 5
        if (is_array($data) && (is_int($key) || is_string($key)) && $key !== '' && array_key_exists($key, $data)) {
44 4
            $out = $data[$key];
45
        }
46 5
        if (! empty($validate) && is_callable($validate)) {
47 2
            $out = (($validate($out) === true) ? $out : $default);
48
        }
49
50 5
        return $out;
51
    }
52
}
53
54
if (! function_exists('rename_key_array')) {
55
    /**
56
     * Переменовывание элементов массива
57
     *
58
     * @param array $data массив с данными
59
     * @param string $prefix префикс ключей
60
     * @param string $suffix суффикс ключей
61
     * @param string $addPS разделитель суффиксов, префиксов и ключей массива
62
     * @param string $sep разделитель ключей при склейке многомерных массивов
63
     * @return array массив с переименованными ключами
64
     */
65
    function rename_key_array($data, $prefix = '', $suffix = '', $addPS = '.', $sep = '.')
66
    {
67 9
        $out = [];
68 9
        if (is_array($data)) {
0 ignored issues
show
introduced by
The condition is_array($data) is always true.
Loading history...
69 9
            if (! is_scalar($addPS)) {
0 ignored issues
show
introduced by
The condition is_scalar($addPS) is always true.
Loading history...
70
                $addPS = '';
71
            }
72 9
            $InsertPrefix = (is_scalar($prefix) && $prefix !== '') ? ($prefix . $addPS) : '';
73 9
            $InsertSuffix = (is_scalar($suffix) && $suffix !== '') ? ($addPS . $suffix) : '';
74 9
            foreach ($data as $key => $item) {
75 9
                $key = $InsertPrefix . $key;
76 9
                $val = null;
77
                switch (true) {
78 9
                    case is_scalar($item):
79 9
                        $val = $item;
80 9
                        break;
81 9
                    case is_array($item):
82 9
                        $val = (is_scalar($sep) && $sep !== '') ?
83 9
                            rename_key_array($item, $key . $sep, $InsertSuffix, '', $sep) : [];
84 9
                        $out = array_merge($out, $val);
85 9
                        $val = '';
86 9
                        break;
87
                }
88 9
                $out[$key . $InsertSuffix] = $val;
89
            }
90
        }
91
92 9
        return $out;
93
    }
94
}
95
96
if (! function_exists('make_array')) {
97
    /**
98
     * Создание многомерного массива из двухмерного, в имени которого содержится разделитель
99
     *
100
     * @param array $data массив с данными
101
     * @param string $sep разделитель ключей при склейке многомерных массивов
102
     * @return array массив с переименованными ключами
103
     */
104
    function make_array($data, $sep = '.')
105
    {
106 2
        $out = [];
107 2
        if (is_array($data)) {
0 ignored issues
show
introduced by
The condition is_array($data) is always true.
Loading history...
108 2
            if (is_scalar($sep) && $sep !== '') {
109 1
                foreach ($data as $key => $val) {
110 1
                    $keys = explode($sep, $key);
111 1
                    $workArray = &$out;
112 1
                    foreach ($keys as $i => $subKey) {
113 1
                        if (! array_key_exists($subKey, $workArray)) {
114 1
                            $workArray[$subKey] = ($i + 1 == count($keys)) ? $val : [];
115
                        }
116 1
                        $workArray = &$workArray[$subKey];
117
                    }
118
                }
119
            } else {
120 1
                $out = $data;
121
            }
122
        }
123
124 2
        return $out;
125
    }
126
}
127
128
if (! function_exists('array_sort')) {
129
    /**
130
     * Сортировка массива
131
     *
132
     * @param array $arr массив с данными
133
     * @param string $sort_field по какому ключу сортировать массив
134
     * @param bool $desc направление сортировки
135
     * @return array
136
     */
137
    function array_sort(array $arr, $sort_field, $desc = false)
138
    {
139
        $first = reset($arr);
140
        if (! isset($first[$sort_field])) {
141
            return $arr;
142
        }
143
        $sort = [];
144
        foreach ($arr as $key => $item) {
145
            $sort[$key] = $item[$sort_field];
146
        }
147
        array_multisort($sort, $desc ? SORT_DESC : SORT_ASC, $arr);
148
149
        return $arr;
150
    }
151
}
152
153
if (! function_exists('array_unset')) {
154
    /**
155
     * Удаление списка ключей из массива
156
     *
157
     * @param array $arr массив с данными
158
     * @param string|array $keys ключ или массив ключей, которые необходимо удалить
159
     * @return array
160
     */
161
    function array_unset($arr, $keys)
162
    {
163
        if (is_scalar($keys)) {
164
            $keys = [$keys];
165
        }
166
        if (is_array($keys) && is_array($arr)) {
0 ignored issues
show
introduced by
The condition is_array($arr) is always true.
Loading history...
167
            foreach ($keys as $key) {
168
                if (is_scalar($key)) {
169
                    unset($arr[$key]);
170
                }
171
            }
172
        }
173
174
        return $arr;
175
    }
176
}
177
178
if (! function_exists('array_filter')) {
179
    /**
180
     * Фильтрация массива
181
     *
182
     * @param array $data массив с данными
183
     * @param string|Closure $filter функция для фильтрации массива
184
     * @return array
185
     */
186
    function array_filter($data, $filter)
187
    {
188
        $out = [];
189
        foreach ($data as $k => $v) {
190
            if (is_callable($filter) && $filter($v, $k)) {
191
                $out[$k] = $v;
192
            }
193
        }
194
195
        return $out;
196
    }
197
}
198
199
if (! function_exists('array_path')) {
200
    /**
201
     * Получение значения многомерного массива
202
     *
203
     * @param array $array многомерный массив
204
     * @param string $path путь к ключу многомерного массива (каждый уровень разделяется символом $separator)
205
     * @param mixed $default значение по умолчанию, если ключа в массиве нет
206
     * @param string $separator разделитель уровней массива
207
     * @return mixed
208
     */
209
    function array_path($array, $path, $default = null, $separator = '.')
210
    {
211
        $path = explode($separator, $path);
212
        while ($key = array_shift($path)) {
213
            if (! isset($array[$key])) {
214
                return $default;
215
            }
216
            $array = $array[$key];
217
        }
218
219
        return $array;
220
    }
221
}
222
223
if (! function_exists('array_path_unset')) {
224
    /**
225
     * Удаление ключа многомерного массива
226
     *
227
     * @param array $array многомерный массив
228
     * @param string $path путь к ключу многомерного массива (каждый уровень разделяется символом $separator)
229
     * @param string $separator разделитель уровней массива
230
     * @return void
231
     */
232
    function array_path_unset(&$array, $path, $separator = '.')
233
    {
234
        $tmp = &$array;
235
        $path = explode($separator, $path);
236
        while (count($path) > 1) {
237
            $key = array_shift($path);
238
            if (! isset($tmp[$key])) {
239
                return;
240
            }
241
            $tmp = &$tmp[$key];
242
        }
243
        unset($tmp[array_shift($path)]);
244
    }
245
}
246
247
if (! function_exists('array_path_replace')) {
248
    /**
249
     * Заменить значение многомерного массива
250
     *
251
     * @param array $array многомерный массив
252
     * @param string $path путь к ключу многомерного массива (каждый уровень разделяется символом $separator)
253
     * @param mixed $value новое значение
254
     * @param string $separator разделитель уровней массива
255
     * @return void
256
     */
257
    function array_path_replace(&$array, $path, $value, $separator = '.')
258
    {
259
        $tmp = &$array;
260
        $path = explode($separator, $path);
261
        while (count($path) > 1) {
262
            $key = array_shift($path);
263
            if (! isset($tmp[$key])) {
264
                $tmp[$key] = [];
265
            }
266
            $tmp = &$tmp[$key];
267
        }
268
        $tmp[array_shift($path)] = $value;
269
    }
270
}
271
272
if (! function_exists('array_clean')) {
273
    /**
274
     * Удалить пустые элементы из массива
275
     *
276
     * @param array $array
277
     * @param array $symbols удаляемые значения
278
     * @return array
279
     */
280
    function array_clean($array, array $symbols = ['', null])
281
    {
282
        return is_array($array) ? array_diff($array, $symbols) : [];
0 ignored issues
show
introduced by
The condition is_array($array) is always true.
Loading history...
283
    }
284
}
285
286
if (! function_exists('array_shuffle')) {
287
    /**
288
     * Перемешать массив в случайном порядке с сохранением ключей
289
     *
290
     * @param array $data массив с данными
291
     * @return bool результат сортировки массива
292
     */
293
    function array_shuffle(array &$data = [])
294
    {
295
        return uksort($data, function () {
296
            return rand() > rand();
297
        });
298
    }
299
}
300
301
if (! function_exists('array_random')) {
302
    /**
303
     * Получить несколько случайных записей из массива с сохранением ключей
304
     *
305
     * @param array $data массив с данными
306
     * @param int $count требуемое число записей из массива
307
     * @return array|mixed
308
     */
309
    function array_random(array $data = [], $count = 1)
310
    {
311
        $flag = array_shuffle($data);
312
        if ($flag) {
313
            if ((int)$count > 0) {
314
                $data = current(array_chunk($data, (int)$count, true));
315
            }
316
        } else {
317
            $data = [];
318
        }
319
320
        return $data;
321
    }
322
}
323
324
if (! function_exists('is_assoc')) {
325
    /**
326
     * Является ли массив ассоциативным
327
     *
328
     * @param array $array проверяемый массив
329
     * @return bool результат проверки
330
     */
331
    function is_assoc($array)
332
    {
333
        return is_array($array) ? (bool)count(array_filter(array_keys($array), 'is_string')) : false;
0 ignored issues
show
introduced by
The condition is_array($array) is always true.
Loading history...
334
    }
335
}
336
337
if (! function_exists('array_copy_key')) {
338
    /**
339
     * Определить ключи массива равыне значениям
340
     *
341
     * @param array $data исходный массив со значениями
342
     * @return array
343
     */
344
    function array_copy_key(array $data = [])
345
    {
346
        $data = array_filter($data, function ($val) {
347
            return is_scalar($val);
348
        });
349
350
        return array_combine($data, $data);
351
    }
352
}
353
354
if (! function_exists('make_tree')) {
355
    /**
356
     * Helper function
357
     * @see http://gostash.it/ru/users/3191
358
     *
359
     * @param array $tree flat data, implementing a id/parent id (adjacency list) structure
360
     * @param mixed $pid root id, node to return
361
     * @param string $parent parent id index
362
     * @param string $key id index
363
     * @param string $children children index
364
     * @return array
365
     */
366
    function make_tree($tree = [], $pid = 0, $parent = 'pid', $key = 'id', $children = 'tree')
367
    {
368
        $result = [];
369
370
        if (! empty($tree)) {
371
            $m = [];
372
373
            foreach ($tree as $e) {
374
                isset($m[$e[$parent]]) ?: $m[$e[$parent]] = [];
375
                isset($m[$e[$key]]) ?: $m[$e[$key]] = [];
376
377
                $m[$e[$parent]][] = array_merge($e, [$children => &$m[$e[$key]]]);
378
            }
379
380
            $result = $m[$pid];
381
        }
382
383
        return $result;
384
    }
385
}
386
387
if (! function_exists('array_chunk_vcolumn')) {
388
    /**
389
     * Разбиение массива на несколько частей с сохранением ключей, чтобы в каждой из этих частей было равное кол-во элементов
390
     * Массив наполняется последовательно. Т.е. сначала наполняется данными первая часть, потом вторая и так, пока не закончатся данные.
391
     *
392
     * @see: http://gostash.it/ru/stashes/117
393
     * @param array $input исходный массив
394
     * @param int $size кол-во частей
395
     */
396
    function array_chunk_vcolumn(array $input, $size)
397
    {
398
        $data = array_fill(0, $size, []);
399
        $size = ceil(count($input) / $size);
400
        $i = 0;
401
        $j = 0;
402
        foreach ($input as $k => $v) {
403
            if (++$j > $size) {
404
                $i++;
405
                $j = 1;
406
            }
407
            $data[$i][$k] = $v;
408
        }
409
410
        return $data;
411
    }
412
}
413
414
if (! function_exists('array_chunk_hcolumn')) {
415
    /**
416
     * Разбиение массива на несколько частей с сохранением ключей, чтобы в каждой из этих частей было равное кол-во элементов
417
     * Массив наполняется равномерно. Т.е. в первую строку каждой части складывается по одному элементу из массива. Затем аналогичным образом во вторую и так, пока не закончатся данные.
418
     *
419
     * @param array $input исходный массив
420
     * @param int $size кол-во частей
421
     */
422
    function array_chunk_hcolumn(array $input, $size)
423
    {
424
        $data = array_fill(0, $size, []);
425
        $j = -1;
426
        foreach ($input as $k => $v) {
427
            if (++$j >= $size) {
428
                $j = 0;
429
            }
430
            $data[$j][$k] = $v;
431
        }
432
433
        return $data;
434
    }
435
}
436
437
if (! function_exists('array_filter_keys')) {
438
    /**
439
     * Фильтрация массива по ключу
440
     *
441
     * @param array $array исходный массив
442
     * @param string $needle регулярное выражение для фильтрации ключей
443
     */
444
    function array_filter_keys($array, $needle)
445
    {
446
        $matchedKeys = array_filter(array_keys($array), function ($key) use ($needle) {
447
            return preg_match($needle, $key);
448
        });
449
450
        return array_intersect_key($array, array_flip($matchedKeys));
451
    }
452
}
453
if (! function_exists('choose_chance')) {
454
    /***
455
     * Выбор ключа массива со определенной вероятность
456
     * choose_chance(array("a" => 10, "b" => 25, "c" => 25, "d" => 40));
457
     *
458
     * @see: http://gostash.it/ru/stashes/381
459
     * @param array $arr исходный массив
460
     */
461
    function choose_chance(array $arr)
462
    {
463
        $rnd = mt_rand(1, array_sum($arr));
464
        $i = 0;
465
        foreach ($arr as $value => $chance) {
466
            $i += $chance;
467
            //$i = 51;
468
            if ($rnd <= $i) {
469
                return $value;
470
            }
471
        }
472
    }
473
}
474