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)) {
|
|
|
|
|
112
|
9 |
|
if (! is_scalar($addPS)) {
|
|
|
|
|
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)) {
|
|
|
|
|
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)) {
|
|
|
|
|
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) : [];
|
|
|
|
|
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;
|
|
|
|
|
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
|
|
|
|