Как работает функция?

 
Посетитель
no avatar
Сообщений: 39
Подскажите, пожалуйста, как работает функция f_stripslashes? Что у неё на входе и что на выходе - мне понятно, а логика внутри не доходит до меня.
Код PHP:
  1. function f_stripslashes'($mixed) {
  2. if (is_array($mixed)) return array_map('f_stripslashes', $mixed);
  3. else return stripslashes($mixed);
  4. }
  5. if (get_magic_quotes_gpc()) {
  6. $_GET = f_rec_stripslashes($_GET);
  7. }
Посетитель
small user social cms
Медаль
Сообщений: 366
http://php.net/manual/ru/function.array-map.php

array_map — Применяет callback-функцию ко всем элементам указанных массивов
Редактировалось: 1 раз (Последний: 17 января 2017 в 23:52)
Реклама
cms
Посетитель
small user social cms
МедальПочетный донор проекта
Сообщений: 558
Функция вызывает саму себя через array_map() для каждого элемента переданного ей массива (это называется "рекурсией") или выполняется один раз, если переданное значение - не массив.

Рекурсия на Википедии
Примеры использования рекурсии на Хабре
Посетитель
no avatar
Сообщений: 39
Спасибо.

Про рекурсию я знаю и про калл бак тоже читал. По отдельности каждую функцию понимаю, а всё вместе ни бум-бум.
Учитывая, что array_map возвращает массив, то при массиве на входе должна получиться вечная рекурсия, так мне кажется, но на самом деле всё работает исправно.

Или по другому выразить моё непонимание.
Чтобы сработала функция stripslashes, $mixed должен стать не массивом, а этого преобразования нет.

Да, вверху в скрипте описка. Должно быть так:
Код PHP:
  1. function f_stripslashes'($mixed) {
  2. if (is_array($mixed)) return array_map('f_stripslashes', $mixed);
  3. else return stripslashes($mixed);
  4. }
  5. if (get_magic_quotes_gpc()) {
  6. $_GET = f_stripslashes($_GET);
  7. }
Редактировалось: 1 раз (Последний: 18 января 2017 в 12:13)
Посетитель
small user social cms
МедальАвторитет форума
Сообщений: 1147
Код PHP:
  1.  
  2. // В коде лишняя кавычка!
  3. function f_stripslashes($mixed) {
  4. if (is_array($mixed))
  5. // если $mixed является массивом то...
  6. return array_map('f_stripslashes', $mixed);
  7. // ...вызвать эту же функцию отдельно с каждым элементом массива
  8. else return stripslashes($mixed);
  9. // иначе (т.е. если это не массив) вернуть строку без экранирующих бекслешей
  10. }
  11.  
  12. //На PHP 5.4.0 и выше работать не будет!!!
  13. //Если в настройках PHP magic_quotes_gpc включен...
  14. $_GET = f_stripslashes($_GET);
  15. // ...отправить весь массив $_GET на чистку от обратных слешей
  16. }
Редактировалось: 3 раз (Последний: 18 января 2017 в 13:49)
Посетитель
no avatar
Сообщений: 39
Разобрался. Sonat, вам отдельное спасибо за фразу "// ...вызвать эту же функцию отдельно с каждым элементом массива". Я-то думал, что при рекурсии каждый раз передаётся весь массив.

Пошёл плюсик ставить.
Редактировалось: 1 раз (Последний: 19 января 2017 в 10:53)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.