1 | <?php |
||
2 | if (! function_exists('supports_ansi_colors')) { |
||
3 | /** |
||
4 | * Функция позволяет узнать, поддерживает ли консоль цвета и другое форматирование. |
||
5 | * @see: https://gostash.it/ru/stashes/1601-podderzivaet-li-konsol-cveta |
||
6 | * @return bool Результат проверки |
||
7 | * |
||
8 | * DIRECTORY_SEPARATOR === '\\' — проверка на Windows. |
||
9 | * getenv('ANSICON') !== false — проверка запуска через ANSICON. |
||
10 | * getenv('ConEmuANSI') === 'ON' — проверка запуска через ConEmu. |
||
11 | * function_exists('posix_isatty') && @posix_isatty(\STDOUT) — проверка на интерактивный терминал UNIX. |
||
12 | */ |
||
13 | function supports_ansi_colors() |
||
14 | { |
||
15 | return DIRECTORY_SEPARATOR === '\\' |
||
16 | ? getenv('ANSICON') !== false || getenv('ConEmuANSI') === 'ON' |
||
17 | : function_exists('posix_isatty') && @posix_isatty(\STDOUT); |
||
18 | } |
||
19 | } |
||
20 | |||
21 | if (! function_exists('check_email')) { |
||
22 | /** |
||
23 | * Проверка строки с email на наличие ошибок |
||
24 | * Если e-mail валидный, то в ответ будет получено false |
||
25 | * В противном случае имя ошибки |
||
26 | * dns - ошибка проверки MX и A записи почтового домена |
||
27 | * format - ошибка формата email |
||
28 | * |
||
29 | * @param string $email проверяемый email |
||
30 | * @param bool $dns проверять ли DNS записи |
||
31 | * @return false|string Результат проверки почтового ящика |
||
32 | */ |
||
33 | function check_email($email, $dns = true) |
||
34 | { |
||
35 | 7 | if (filter_var($email, FILTER_VALIDATE_EMAIL)) { |
|
36 | 2 | list(, $domain) = explode("@", $email, 2); |
|
37 | 2 | if (! $dns || ($dns && checkdnsrr($domain, "MX") && checkdnsrr($domain, "A"))) { |
|
38 | 1 | $error = false; |
|
39 | } else { |
||
40 | 2 | $error = 'dns'; |
|
41 | } |
||
42 | } else { |
||
43 | 5 | $error = 'format'; |
|
44 | } |
||
45 | |||
46 | 7 | return $error; |
|
47 | } |
||
48 | } |
||
49 | |||
50 | if (! function_exists('generate_password')) { |
||
51 | /** |
||
52 | * Генерация пароля |
||
53 | * |
||
54 | * @param string $len длина пароля |
||
55 | * @param string $data правила генерации пароля |
||
56 | * @return string Строка с паролем |
||
57 | * |
||
58 | * Расшифровка значений $data |
||
59 | * "A": A-Z буквы |
||
60 | * "a": a-z буквы |
||
61 | * "0": цифры |
||
62 | * ".": все печатные символы |
||
63 | * |
||
64 | * @example |
||
65 | * generate_password(10,"Aa"); //nwlTVzFdIt |
||
66 | * generate_password(8,"0"); //71813728 |
||
67 | * generate_password(11,"A"); //VOLRTMEFAEV |
||
68 | * generate_password(5,"a0"); //4hqi7 |
||
69 | * generate_password(5,"."); //2_Vt} |
||
70 | * generate_password(20,"."); //AMV,>&?J)v55,(^g}Z06 |
||
71 | * generate_password(20,"aaa0aaa.A"); //rtvKja5xb0\KpdiRR1if |
||
72 | */ |
||
73 | function generate_password($len, $data = '') |
||
74 | { |
||
75 | 3 | if ($data == '') { |
|
76 | $data = 'Aa0.'; |
||
77 | } |
||
78 | 3 | $opt = strlen($data); |
|
79 | 3 | $pass = []; |
|
80 | 3 | for ($i = $len; $i > 0; $i--) { |
|
81 | 3 | switch ($data[rand(0, ($opt - 1))]) { |
|
82 | 3 | case 'A': |
|
83 | 1 | $tmp = rand(65, 90); |
|
84 | 1 | break; |
|
85 | 3 | case 'a': |
|
86 | 1 | $tmp = rand(97, 122); |
|
87 | 1 | break; |
|
88 | 2 | case '0': |
|
89 | 1 | $tmp = rand(48, 57); |
|
90 | 1 | break; |
|
91 | default: |
||
92 | 1 | $tmp = rand(33, 126); |
|
93 | } |
||
94 | 3 | $pass[] = chr($tmp); |
|
95 | } |
||
96 | 3 | $pass = implode("", $pass); |
|
97 | |||
98 | 3 | return $pass; |
|
99 | } |
||
100 | } |
||
101 | |||
102 | if (! function_exists('get_gravatar')) { |
||
103 | /** |
||
104 | * Получение ссылки на аватарку с gravatar |
||
105 | * |
||
106 | * @param string $email Почта |
||
107 | * @param integer $size Размер аватарки |
||
108 | * @return string |
||
109 | */ |
||
110 | function get_gravatar($email, $size = 32) |
||
111 | { |
||
112 | 2 | $url = '//www.gravatar.com/avatar/' . md5(is_scalar($email) ? $email : '') . '?s=' . (int)abs($size); |
|
0 ignored issues
–
show
introduced
by
![]() |
|||
113 | |||
114 | 2 | return $url; |
|
115 | } |
||
116 | } |
||
117 | |||
118 | if (! function_exists('share_vk')) { |
||
119 | /** |
||
120 | * Получение ссылки поделиться для "Вконтакте" |
||
121 | * |
||
122 | * @param string $url Страница которой следует поделиться |
||
123 | * @param string $title Заголовок |
||
124 | * @return string |
||
125 | */ |
||
126 | function share_vk($url, $title = '') |
||
127 | { |
||
128 | return 'http://vkontakte.ru/share.php?url=' . urlencode($url) . '&title=' . urlencode($title); |
||
129 | } |
||
130 | } |
||
131 | |||
132 | if (! function_exists('share_ok')) { |
||
133 | /** |
||
134 | * Получение ссылки поделиться для "Одноклассников" |
||
135 | * |
||
136 | * @param string $url Страница которой следует поделиться |
||
137 | * @param string $title Заголовок |
||
138 | * @return string |
||
139 | */ |
||
140 | function share_ok($url, $title = '') |
||
141 | { |
||
142 | return 'http://www.odnoklassniki.ru/dk?st.cmd=addShare' . |
||
143 | '&st._surl=' . urlencode($url) . |
||
144 | '&st.comments=' . urlencode($title); |
||
145 | } |
||
146 | } |
||
147 | |||
148 | if (! function_exists('share_google')) { |
||
149 | /** |
||
150 | * Получение ссылки поделиться для "Google+" |
||
151 | * |
||
152 | * @param string $url Страница которой следует поделиться |
||
153 | * @return string |
||
154 | */ |
||
155 | function share_google($url) |
||
156 | { |
||
157 | return 'https://plus.google.com/share?url=' . urlencode($url); |
||
158 | } |
||
159 | } |
||
160 | |||
161 | if (! function_exists('share_facebook')) { |
||
162 | /** |
||
163 | * Получение ссылки поделиться для "Facebook" |
||
164 | * |
||
165 | * @param string $url Страница которой следует поделиться |
||
166 | * @param string $title Заголовок |
||
167 | * @return string |
||
168 | */ |
||
169 | function share_facebook($url, $title = '') |
||
170 | { |
||
171 | return 'http://www.facebook.com/sharer/sharer.php?s=100' . |
||
172 | '&p[url]=' . urlencode($url) . |
||
173 | '&p[title]=' . urlencode($title); |
||
174 | } |
||
175 | } |
||
176 | |||
177 | if (! function_exists('share_twitter')) { |
||
178 | /** |
||
179 | * Получение ссылки поделиться для "Twitter" |
||
180 | * |
||
181 | * @param string $url Страница которой следует поделиться |
||
182 | * @param string $title Заголовок |
||
183 | * @return string |
||
184 | */ |
||
185 | function share_twitter($url, $title = '') |
||
186 | { |
||
187 | return 'https://twitter.com/intent/tweet?url=' . urlencode($url) . '&text=' . urlencode($title); |
||
188 | } |
||
189 | } |
||
190 | |||
191 | if (! function_exists('share_mail')) { |
||
192 | /** |
||
193 | * Получение ссылки поделиться для "Mail.ru" |
||
194 | * |
||
195 | * @param string $url Страница которой следует поделиться |
||
196 | * @param string $title Заголовок |
||
197 | * @return string |
||
198 | */ |
||
199 | function share_mail($url, $title = '') |
||
200 | { |
||
201 | return 'http://connect.mail.ru/share?share_url=' . urlencode($url) . '&title=' . urlencode($title); |
||
202 | } |
||
203 | } |
||
204 | |||
205 | if (! function_exists('share_linkedin')) { |
||
206 | /** |
||
207 | * Получение ссылки поделиться для "LinkedIN" |
||
208 | * |
||
209 | * @param string $url Страница которой следует поделиться |
||
210 | * @param string $title Заголовок |
||
211 | * @return string |
||
212 | */ |
||
213 | function share_linkedin($url, $title = '') |
||
214 | { |
||
215 | return 'http://www.linkedin.com/shareArticle?mini=true&url=' . urlencode($url) . '&title=' . urlencode($title); |
||
216 | } |
||
217 | } |
||
218 | |||
219 | if (! function_exists('qr_code')) { |
||
220 | /** |
||
221 | * Генерация QR-кода для строки |
||
222 | * |
||
223 | * @param string $str строка |
||
224 | * @param int $size размер картинки |
||
225 | * @return string |
||
226 | */ |
||
227 | function qr_code($str, $size = 230) |
||
228 | { |
||
229 | $size = (int)$size; |
||
230 | $size = implode("x", [$size, $size]); |
||
231 | |||
232 | return '//chart.apis.google.com/chart?cht=qr&chs=' . $size . '&chl=' . (is_scalar($str) ? urlencode($str) : ''); |
||
0 ignored issues
–
show
|
|||
233 | } |
||
234 | } |
||
235 | |||
236 | if (! function_exists('get_user_ip')) { |
||
237 | /** |
||
238 | * Получение реального ip текущего пользователя |
||
239 | * |
||
240 | * @param string $out IP адрес который будет отдан функцией, если больше ничего не обнаружено |
||
241 | * @return string IP пользователя |
||
242 | * |
||
243 | * @see http://stackoverflow.com/questions/5036443/php-how-to-block-proxies-from-my-site |
||
244 | */ |
||
245 | function get_user_ip($out = '127.0.0.1') |
||
246 | { |
||
247 | $_getEnv = function ($data) { |
||
248 | switch (true) { |
||
249 | case (isset($_SERVER[$data])): |
||
250 | $out = $_SERVER[$data]; |
||
251 | break; |
||
252 | case (isset($_ENV[$data])): |
||
253 | $out = $_ENV[$data]; |
||
254 | break; |
||
255 | case ($tmp = getenv($data)): |
||
256 | $out = $tmp; |
||
257 | break; |
||
258 | case (function_exists('apache_getenv') && $tmp = apache_getenv($data, true)): |
||
259 | $out = $tmp; |
||
260 | break; |
||
261 | default: |
||
262 | $out = false; |
||
263 | } |
||
264 | unset($tmp); |
||
265 | |||
266 | return $out; |
||
267 | }; |
||
268 | |||
269 | //Порядок условий зависит от приоритетов |
||
270 | switch (true === true) { |
||
271 | case ($tmp = $_getEnv('HTTP_COMING_FROM')): |
||
272 | $out = $tmp; |
||
273 | break; |
||
274 | case ($tmp = $_getEnv('HTTP_X_COMING_FROM')): |
||
275 | $out = $tmp; |
||
276 | break; |
||
277 | case ($tmp = $_getEnv('HTTP_VIA')): |
||
278 | $out = $tmp; |
||
279 | break; |
||
280 | case ($tmp = $_getEnv('HTTP_FORWARDED')): |
||
281 | $out = $tmp; |
||
282 | break; |
||
283 | case ($tmp = $_getEnv('HTTP_FORWARDED_FOR')): |
||
284 | $out = $tmp; |
||
285 | break; |
||
286 | case ($tmp = $_getEnv('HTTP_X_FORWARDED')): |
||
287 | $out = $tmp; |
||
288 | break; |
||
289 | case ($tmp = $_getEnv('HTTP_X_FORWARDED_FOR')): |
||
290 | $out = $tmp; |
||
291 | break; |
||
292 | case (! empty($_SERVER['REMOTE_ADDR'])): |
||
293 | $out = $_SERVER['REMOTE_ADDR']; |
||
294 | break; |
||
295 | } |
||
296 | unset($tmp); |
||
297 | |||
298 | return (is_scalar($out) && preg_match('|^(?:[0-9]{1,3}\.){3,3}[0-9]{1,3}$|', $out, $matches)) ? $out : false; |
||
299 | } |
||
300 | } |
||
301 | |||
302 | if (! function_exists('whois_query')) { |
||
303 | /** |
||
304 | * Получение whois информации о домене |
||
305 | * @see http://www.jonasjohn.de/snippets/php/whois-query.htm |
||
306 | * |
||
307 | * @param string $domain домен |
||
308 | * @return string |
||
309 | */ |
||
310 | function whois_query($domain) |
||
311 | { |
||
312 | |||
313 | // fix the domain name: |
||
314 | $domain = strtolower(trim($domain)); |
||
315 | $domain = preg_replace('/^http:\/\//i', '', $domain); |
||
316 | $domain = preg_replace('/^www\./i', '', $domain); |
||
317 | $domain = explode('/', $domain); |
||
318 | $domain = trim($domain[0]); |
||
319 | |||
320 | // split the TLD from domain name |
||
321 | $_domain = explode('.', $domain); |
||
322 | $lst = count($_domain) - 1; |
||
323 | $ext = $_domain[$lst]; |
||
324 | |||
325 | // You find resources and lists |
||
326 | // like these on wikipedia: |
||
327 | // |
||
328 | // <a href="http://de.wikipedia.org/wiki/Whois">http://de.wikipedia.org/wiki/Whois</a> |
||
329 | // |
||
330 | $servers = [ |
||
331 | "biz" => "whois.neulevel.biz", |
||
332 | "com" => "whois.internic.net", |
||
333 | "us" => "whois.nic.us", |
||
334 | "coop" => "whois.nic.coop", |
||
335 | "info" => "whois.nic.info", |
||
336 | "name" => "whois.nic.name", |
||
337 | "net" => "whois.internic.net", |
||
338 | "gov" => "whois.nic.gov", |
||
339 | "edu" => "whois.internic.net", |
||
340 | "mil" => "rs.internic.net", |
||
341 | "int" => "whois.iana.org", |
||
342 | "ac" => "whois.nic.ac", |
||
343 | "ae" => "whois.uaenic.ae", |
||
344 | "at" => "whois.ripe.net", |
||
345 | "au" => "whois.aunic.net", |
||
346 | "be" => "whois.dns.be", |
||
347 | "bg" => "whois.ripe.net", |
||
348 | "br" => "whois.registro.br", |
||
349 | "bz" => "whois.belizenic.bz", |
||
350 | "ca" => "whois.cira.ca", |
||
351 | "cc" => "whois.nic.cc", |
||
352 | "ch" => "whois.nic.ch", |
||
353 | "cl" => "whois.nic.cl", |
||
354 | "cn" => "whois.cnnic.net.cn", |
||
355 | "cz" => "whois.nic.cz", |
||
356 | "de" => "whois.nic.de", |
||
357 | "fr" => "whois.nic.fr", |
||
358 | "hu" => "whois.nic.hu", |
||
359 | "ie" => "whois.domainregistry.ie", |
||
360 | "il" => "whois.isoc.org.il", |
||
361 | "in" => "whois.ncst.ernet.in", |
||
362 | "ir" => "whois.nic.ir", |
||
363 | "mc" => "whois.ripe.net", |
||
364 | "to" => "whois.tonic.to", |
||
365 | "tv" => "whois.tv", |
||
366 | "ru" => "whois.ripn.net", |
||
367 | "org" => "whois.pir.org", |
||
368 | "aero" => "whois.information.aero", |
||
369 | "nl" => "whois.domain-registry.nl" |
||
370 | ]; |
||
371 | |||
372 | if (! isset($servers[$ext])) { |
||
373 | throw new ErrorException('No matching nic server found!'); |
||
374 | } |
||
375 | |||
376 | $nic_server = $servers[$ext]; |
||
377 | |||
378 | $output = ''; |
||
379 | |||
380 | // connect to whois server: |
||
381 | if ($conn = fsockopen($nic_server, 43)) { |
||
382 | fputs($conn, $domain . "\r\n"); |
||
383 | while (! feof($conn)) { |
||
384 | $output .= fgets($conn, 128); |
||
385 | } |
||
386 | fclose($conn); |
||
387 | } else { |
||
388 | throw new ErrorException('Could not connect to ' . $nic_server . '!'); |
||
389 | } |
||
390 | |||
391 | return $output; |
||
392 | } |
||
393 | } |
||
394 | |||
395 | if (! function_exists('copyright')) { |
||
396 | /** |
||
397 | * Геренатор года для подстановки в копирайты |
||
398 | * |
||
399 | * @param string $year год запуска проекта |
||
400 | * @param string $sep разделитель годов |
||
401 | * @return string |
||
402 | */ |
||
403 | function copyright($year, $sep = ' - ') |
||
404 | { |
||
405 | $y = date('Y'); |
||
406 | |||
407 | return ($y != $year) ? ($year . $sep . $y) : $year; |
||
408 | } |
||
409 | } |
||
410 | |||
411 | if (! function_exists('mime_file')) { |
||
412 | /** |
||
413 | * Получение MIME типа файла |
||
414 | * |
||
415 | * @param string $fname путь к файлу |
||
416 | * @return string |
||
417 | */ |
||
418 | function mime_file($fname) |
||
419 | { |
||
420 | $out = null; |
||
421 | switch (true) { |
||
422 | case class_exists('\finfo'): |
||
423 | $fi = new \finfo(FILEINFO_MIME); |
||
424 | $out = $fi->file($fname); |
||
425 | break; |
||
426 | case function_exists('mime_content_type'): |
||
427 | list($out) = explode(';', @mime_content_type($fname)); |
||
428 | break; |
||
429 | default: |
||
430 | /** |
||
431 | * @see: http://www.php.net/manual/ru/function.finfo-open.php#112617 |
||
432 | */ |
||
433 | $fh = fopen($fname, 'rb'); |
||
434 | if ($fh) { |
||
0 ignored issues
–
show
|
|||
435 | $bytes6 = fread($fh, 6); |
||
436 | fclose($fh); |
||
437 | switch (true) { |
||
438 | case ($bytes6 === false): |
||
439 | break; |
||
440 | case (substr($bytes6, 0, 3) == "\xff\xd8\xff"): |
||
441 | $out = 'image/jpeg'; |
||
442 | break; |
||
443 | case ($bytes6 == "\x89PNG\x0d\x0a"): |
||
444 | $out = 'image/png'; |
||
445 | break; |
||
446 | case ($bytes6 == "GIF87a" || $bytes6 == "GIF89a"): |
||
447 | $out = 'image/gif'; |
||
448 | break; |
||
449 | default: |
||
450 | $out = 'application/octet-stream'; |
||
451 | } |
||
452 | } |
||
453 | } |
||
454 | |||
455 | return $out; |
||
456 | } |
||
457 | } |
||
458 | |||
459 | if (! function_exists('image_size')) { |
||
460 | /** |
||
461 | * Определение размеров картинки |
||
462 | * |
||
463 | * @param string $image путь к картинке |
||
464 | * @param string|null $mode какой размер ширину/высоту или все вместе |
||
465 | * @return array|int |
||
466 | */ |
||
467 | function image_size($image, $mode = null) |
||
468 | { |
||
469 | $width = $height = 0; |
||
470 | if (is_scalar($image) && is_file($image)) { |
||
471 | $size = @getimagesize($image); |
||
472 | $width = isset($size[0]) ? $size[0] : 0; |
||
473 | $height = isset($size[1]) ? $size[1] : 0; |
||
474 | } |
||
475 | switch ($mode) { |
||
476 | case 'w': |
||
477 | case 'width': |
||
478 | $out = $width; |
||
479 | break; |
||
480 | case 'h': |
||
481 | case 'height': |
||
482 | $out = $height; |
||
483 | break; |
||
484 | default: |
||
485 | $out = [$width, $height]; |
||
486 | } |
||
487 | |||
488 | return $out; |
||
489 | } |
||
490 | } |
||
491 | |||
492 | if (! function_exists('plural')) { |
||
493 | /** |
||
494 | * Определение падежа слова в зависимости от числового значения |
||
495 | * |
||
496 | * @param int|string $number число |
||
497 | * @param array $titles массив слов в разных склонениях (1 яблоко, 2 яблока, 5 яблок) |
||
498 | * @return string |
||
499 | */ |
||
500 | function plural($number, array $titles = []) |
||
501 | { |
||
502 | $cases = [2, 0, 1, 1, 1, 2]; |
||
503 | $number = abs((int)$number); |
||
504 | $position = ($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[($number % 10 < 5) ? $number % 10 : 5]; |
||
505 | $out = isset($titles[$position]) ? $titles[$position] : ''; |
||
506 | |||
507 | return $out; |
||
508 | } |
||
509 | } |
||
510 | |||
511 | if (! function_exists('validate_date')) { |
||
512 | /** |
||
513 | * Проверка валидности даты |
||
514 | * |
||
515 | * Пример валидации даты через дополнительную проверку $validator |
||
516 | * function($date, $iterval){ |
||
517 | * return ($iterval->format('%R') == '+'); |
||
518 | * } |
||
519 | * Таким образом все даты которые уже прошли будут помечены как не валидные |
||
520 | * |
||
521 | * @param string $date проверяемая дата |
||
522 | * @param string $fromFormat в каком формате записана исходная дата |
||
523 | * @param string $toFormat в каком формате вернуть дату, если она валидна |
||
524 | * @param Closure $validator метод для дополнительной проверки даты |
||
525 | * @return null|string |
||
526 | */ |
||
527 | function validate_date($date, $fromFormat = 'Y-m-d', $toFormat = 'Y-m-d', Closure $validator = null) |
||
528 | { |
||
529 | $validTime = false; |
||
530 | $datetime2 = null; |
||
531 | if (is_scalar($date)) { |
||
0 ignored issues
–
show
|
|||
532 | $datetime1 = new \DateTime("NOW"); |
||
533 | $datetime2 = \DateTime::createFromFormat($fromFormat, $date); |
||
534 | if ($datetime2 instanceof \DateTime) { |
||
535 | $interval = $datetime1->diff($datetime2); |
||
536 | $validTime = is_callable($validator) ? (bool)$validator($datetime2, $interval) : true; |
||
537 | } |
||
538 | } |
||
539 | |||
540 | return $validTime ? $datetime2->format($toFormat) : null; |
||
541 | } |
||
542 | } |
||
543 | if (! function_exists('format_bytes')) { |
||
544 | /** |
||
545 | * Преобразование из байт в другие порядки (кило, мега, гига) с добавлением префикса |
||
546 | * |
||
547 | * @param string $bytes Обрабатываемое число |
||
548 | * @param integer $precision До какого числа после запятой округлять |
||
549 | * @param array $suffixes Массив суффиксов |
||
550 | * @return string |
||
551 | */ |
||
552 | function format_bytes($bytes, $precision = 2, $suffixes = ['Байт', 'Кбайт', 'Мбайт', 'Гбайт', 'Тбайт']) |
||
553 | { |
||
554 | $bytes = (float)$bytes; |
||
555 | if (empty($bytes)) { |
||
556 | return 0; |
||
557 | } |
||
558 | $base = log($bytes, 1024); |
||
559 | |||
560 | return trim( |
||
561 | round(pow(1024, $base - floor($base)), $precision) . |
||
562 | ' ' . |
||
563 | get_key($suffixes, (int)$base, '', 'is_scalar') |
||
564 | ); |
||
565 | } |
||
566 | } |
||
567 | |||
568 | if (! function_exists('format_microtime')) { |
||
569 | /** |
||
570 | * Форматирование microtime времени |
||
571 | * @param string $time microtime время |
||
572 | * @param int $len Кол-во символов после точки |
||
573 | */ |
||
574 | function format_microtime($time, $len = 4) |
||
575 | { |
||
576 | return sprintf("%." . (int)$len . "f", $time); |
||
577 | } |
||
578 | } |
||
579 | if (! function_exists('ip_in_range')) { |
||
580 | /** |
||
581 | * Входит ли указанный IP в заданный диапазон |
||
582 | * |
||
583 | * @param string $ip IP клиента |
||
584 | * @param string $lower Начальный IP диапазона |
||
585 | * @param string $upper Конечный IP диапазона |
||
586 | * @return bool |
||
587 | */ |
||
588 | function in_ip_range($ip, $lower, $upper) |
||
589 | { |
||
590 | return (ip2long($lower) <= ip2long($ip) && ip2long($upper) >= ip2long($ip)) ? true : false; |
||
591 | } |
||
592 | } |
||
593 | |||
594 | if (! function_exists('make_csv')) { |
||
595 | /** |
||
596 | * Формирование правильной CSV строки |
||
597 | * |
||
598 | * @see: https://stackoverflow.com/questions/3933668/convert-array-into-csv |
||
599 | * @param array $data Массив с данными |
||
600 | * @return string |
||
601 | */ |
||
602 | function make_csv($data, $separator = ",") |
||
603 | { |
||
604 | // Create a stream opening it with read / write mode |
||
605 | $stream = fopen('data://text/plain,' . "", 'w+'); |
||
606 | |||
607 | // Iterate over the data, writting each line to the text stream |
||
608 | fputcsv($stream, $data, $separator); |
||
609 | |||
610 | // Rewind the stream |
||
611 | rewind($stream); |
||
612 | |||
613 | // You can now echo it's content |
||
614 | $out = stream_get_contents($stream); |
||
615 | |||
616 | // Close the stream |
||
617 | fclose($stream); |
||
618 | |||
619 | return $out; |
||
620 | } |
||
621 | } |
||
622 |