Как вы реплицируете массив, сохраняя при этом одни и те же ключи?
-
05-07-2019 - |
Вопрос
ОК.Я написал простую (ish) функцию, которая принимает аргумент и возвращает тот же аргумент с опасными html-символами, замененными их символьными сущностями.
Функция может принимать в качестве аргумента либо строку, либо массив, либо 2D-массив - 3d-массивы или более не поддерживаются.
Функция заключается в следующем:
public function html_safe($input)
{
if(is_array($input)) //array was passed
{
$escaped_array = array();
foreach($input as $in)
{
if(is_array($in)) //another array inside the initial array found
{
$inner_array = array();
foreach($in as $i)
{
$inner_array[] = htmlspecialchars($i);
}
$escaped_array[] = $inner_array;
}
else
$escaped_array[] = htmlspecialchars($in);
}
return $escaped_array;
}
else // string
return htmlspecialchars($input);
}
Эта функция действительно работает, но проблема в том, что мне нужно сохранить ключи массива исходного массива.
Целью этой функции было сделать так, чтобы мы могли буквально передавать результирующий набор из запроса к базе данных и получать обратно все значения с сохраненными символами HTML.Очевидно, поэтому, что ключами в массиве будут имена полей базы данных, и моя функция в данный момент заменяет их числовыми значениями.
Так что да, мне нужно вернуть тот же аргумент, переданный функции, с сохраненными ключами массива (если массив был передан).
Надеюсь, это имеет смысл, предложения приветствуются.
Решение
Вы можете использовать рекурсию вместо того, чтобы вкладывать множество предварительных запросов:
function html_safe($input) {
if (is_array($input)) {
return array_map('html_safe', $input);
} else {
return htmlspecialchars($input);
}
}
Другие советы
Хорошо, я думаю, что с этим я разобрался сам...
в моих циклах foreach не было указано никаких ключей, например, они были:
foreach($array_val as $val)
вместо того , чтобы:
foreach($array_val as $key => $val)
в этом случае я мог бы сохранить ключи массива в выходных arrrays.