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

#1 17 января 2017 в 22:51
Подскажите, пожалуйста, как работает функция f_stripslashes? Что у неё на входе и что на выходе — мне понятно, а логика внутри не доходит до меня.
  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. }
#3 18 января 2017 в 01:44
Функция вызывает саму себя через array_map() для каждого элемента переданного ей массива (это называется "рекурсией") или выполняется один раз, если переданное значение — не массив.

Рекурсия на Википедии
Примеры использования рекурсии на Хабре
#4 18 января 2017 в 12:02
Спасибо.

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

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

Да, вверху в скрипте описка. Должно быть так:
  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. }
#5 18 января 2017 в 13:47
  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. }
#6 19 января 2017 в 10:51
Разобрался. Sonat, вам отдельное спасибо за фразу "//… вызвать эту же функцию отдельно с каждым элементом массива". Я-то думал, что при рекурсии каждый раз передаётся весь массив.

Пошёл плюсик ставить.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.