Как я выполняю функцию PHP htmlspecialchars()
на массиве объектов массива?
У меня есть следующий код:
$result_set = Array
(
[0] => Array
(
[home_id] => 1
[address] => 4225 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 76798
)
[1] => Array
(
[home_id] => 8
[address] => 4229 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 75093
)
);
// this doesn't work since $result_set is an array of arrays and htmlspecialchars is expecting a string
htmlspecialchars($result_set, ENT_QUOTES, 'UTF-8'));
ОБНОВЛЕНИЕ:
Обратите внимание на то, что даже при том, что существует довольно много ответов ниже, ни один из них не работает на массив массивов. Ответы ниже только работают на простые массивы.
Я попробовал следующее, но это не работает:
array_walk_recursive($result_set, "htmlspecialchars", array(ENT_QUOTES,'UTF-8'))
Я получаю следующую ошибку: htmlspecialchars() expects parameter 2 to be long, string given
ОБНОВЛЕНИЕ 2
Когда я пробую:
function cleanOutput(&$value) {
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));
Я получаю следующее, нежелательное, произвожу:
Array
(
[0] => Array
(
[home_id] => 1
[address] => 4225 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 76798
)
[1] => Array
(
[home_id] => 8
[address] => 4229 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 75093
)
)
-------1
ОБНОВЛЕНИЕ 3
Когда я пробую:
function cleanOutput(&$value) {
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
$result_set = Array
(
[0] => Array
(
[home_id] => 1
[address] => 4225 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 76798
)
[1] => Array
(
[home_id] => 8
[address] => 4229 Nasmyth Dr
[city] => Plano
[state] => TX
[zip] => 75093
)
);
$cleanedOutput = array();
foreach ($result_set as $rs) {
$cleaned[] = array_map("cleanOutput", $rs);
}
print_r($cleanedOutput);
Я получаю следующее, нежелательное, результаты:
{'homes' : []}
function filter(&$value) {
$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
array_walk_recursive($result_set, "filter");
print_r($result_set);
Можно использовать array_map()
для запуска этого метода на каждой записи.
$cleaned = array_map("htmlspecialchars", $myArray);
Если вам нужно передать аргументы в htmlspecialchars()
, то вы можете заменить их своей собственной пользовательской функцией:
function myFunc($a) {
return htmlspecialchars($a, ENT_QUOES);
}
$cleaned = array_map("myFunc", $myArray);
Учитывая тот факт, что вы имеете дело с массивом массивов, а не с массивом строк, для того, чтобы добраться до ваших строк, вам нужно будет циклически прокручивать их через внешний массив:
$cleaned = array();
foreach ($result_set as $rs) {
foreach ($rs as $r) {
$cleaned[] = array_map("htmlspecialchars", $r);
}
}
Или можно использовать array_walk_recursive()
:
array_walk_recursive($myArray, "htmlspecialchars");
Обратите внимание, что этот метод изменяет объект $myArray по ссылке, поэтому нет необходимости присваивать вывод новой переменной.
Если вы хотите использовать array_map и передать аргументы функции, то вы можете создать свою собственную функцию и использовать ее в качестве обратного вызова:
function cleanhtml($dirtyhtml) {
return htmlspecialchars($dirtyhtml, UTF-8);
}
$cleaned = array_map("cleanhtml", $myArray);
]Вы можете использовать array_map, как предложил Джонатон Сампсон, другой вариант - []array_walk[][
]. [] Разница в том, что array_map возвращает копию массива с функцией, применяемой к каждому элементу, в то время как array_walk работает непосредственно с массивом, который Вы поставляете.[
].] Вам не нужно создавать свою собственную функцию, если вы передаете несколько аргументов в вызываемую функцию обратного вызова. [
] [] В соответствии с [] php.net []: [
] [][] array_map ( обратный вызов $callback , массив $arr1 [, массив $... ] )[
][
] Это значит, что если вы хотите передать несколько аргументов, вы должны просто передать:[
] [$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES, 'UTF-8'));
]
[] но по какой-то причине это не работает на меня. [
] [] Но похоже, что это так, не спрашивай меня почему. [
] [$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES), array('UTF-8'));
]