Что-то такое рекурсия, многие из Вас знают. Но, на всякий случай, рекурсия - это вызов функции внутри самой себя . Однако, это определение все знают, но вот с пониманием возникают неясности. Я решил в этом материале разобрать рекурсию в PHP на достаточно простом и реальном примере из практики.
Что-то такое рекурсия, многие из Вас знают. Но, на всякий случай, рекурсия - это вызов функции внутри самой себя. Однако, это определение все знают, но вот с пониманием возникают неясности. Я решил в этом материале разобрать рекурсию в PHP на достаточно простом и реальном примере из практики.
Не секрет, что все данные (за редким исключением), приходящие из форм, надо пропускать через функцию htmlspecialchars(), дабы избежать XSS. И я думаю, что Вы знаете, что некоторые входные данные являются массивами (например, при той же загрузке файлов). И наша с Вами задача написать такую функцию, которая принимает массив всех входящих данных, а также учесть, что среди этих данных есть также массивы, внутри которых также могут быть массивы и так далее.
Привожу код функции:
<?php
function xss($data) {
if (is_array($data)) { // Если это массив
$result = array(); // Создаём новый массив
foreach ($data as $key => $value) { // Перебираем исходный массив
$result[$key] = xss($value); // Рекурсивно вызываем функцию xss
}
return $result; // Возвращаемый "защищённый" массив
}
return htmlspecialchars($data, ENT_QUOTES); // Если это не массив, то вызываем htmlspecialchars()
}
$data = xss($_REQUEST); // Пример вызова функции
?>
Ключевым моментом здесь является, что внутренних массивов внутри входящего $data может быть очень много, поэтому без рекурсии в PHP здесь не обойтись. А сам алгоритм простой:
- Если входящие данные - это НЕ массив, то просто вызываем функцию htmlspecialchars().
- Если входящие данные - это массив, то перебираем все элементы массива и для каждого вызываем эту же функцию. А дальше возвращаемся к пункту 1.
Я понимаю, что для новичков рекурсия в PHP - это достаточно сложная вещь, но я стоит прямо пройтись по коду, как будто Вы интерпритатор PHP. Тогда станет всё яснее.
