array_unset()   A
last analyzed

Complexity

Conditions 6
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

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