如何在数组对象数组上运行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' : []}
答案 0 :(得分:23)
您可以使用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对象,因此无需将输出分配给新变量。
答案 1 :(得分:14)
function filter(&$value) {
$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
array_walk_recursive($result_set, "filter");
print_r($result_set);
答案 2 :(得分:4)
您可能希望使用array_map作为Jonathon Sampson建议,另一种选择是array_walk
不同之处在于array_map返回数组的副本,其中函数应用于每个元素,而array_walk直接在您提供的数组上运行。
答案 3 :(得分:2)
让它适用于多维数组:
function secure($val) {
return (is_array($val))?array_map('secure',$val):htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
}
它有效,它在没有最后使用数组的数组上调用它自己,如果它不是数组,它将它传递给htmlspecialchars函数。
输入:Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )
输出:Array ( [0] => test< [1] => Array ( [test>] => <test?> ) [2] => Array ( [0] => test [1] => > [2] => Array ( [0] => bigtest<> ) ) )
答案 4 :(得分:1)
如果要将多个参数传递给回调函数,则无需创建自己的函数。
根据php.net:
array array_map ( callback $callback , array $arr1 [, array $... ] )
这意味着如果你想传递多个参数,你应该传递:
$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES, 'UTF-8'));
但由于某些原因,这对我不起作用。
但这似乎确实如此,不要问我为什么。
$clean_array = array_map("htmlspecialchars", $myArray, array(ENT_QUOTES), array('UTF-8'));
答案 5 :(得分:0)
如果你想使用array_map并传递函数参数,你可以创建自己的函数并将其用作回调函数:
function cleanhtml($dirtyhtml) {
return htmlspecialchars($dirtyhtml, UTF-8);
}
$cleaned = array_map("cleanhtml", $myArray);
答案 6 :(得分:0)
function htmlspecialchars_array_modify (&$arr){
array_walk_recursive($arr,function(&$value){
$value=htmlspecialchars($value);
});
return $arr;
}
//这会改变来源
答案 7 :(得分:0)
此页面上的许多答案要么不够,过时,要么使用array_map或array_walk_recursive的错误参数。这是一个以递归方式修复数组中所有标量值的函数。
python3 manage.py makemigrations
python3 manage.py migrate
<?php
function htmlspecialchars_recursive ($input, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = false) {
static $flags, $encoding, $double_encode;
if (is_array($input)) {
return array_map('htmlspecialchars_recursive', $input);
}
else if (is_scalar($input)) {
return htmlspecialchars($input, $flags, $encoding, $double_encode);
}
else {
return $input;
}
}
$test = array(
0 => array(
'test-1' => 'testing <p>html tag</p> will be fixed',
'test-2' => '® valid and will be left intact',
'test-3' => '© 2080 kept intact'
),
1 => array(
'test-4' => array(
'test-5' => 'deeper fix on <p>html tag</p> test',
'test-6' => '® will be left intact',
'test-7' => '© 2080 kept intact'
)
)
);
print_r(htmlspecialchars_recursive($test));
?>
答案 8 :(得分:0)
验证类功能
function htmlspecialchars_recursive ($input, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = false) {
static $flags, $encoding, $double_encode;
if (is_array($input)) {
return array_map(array($this, 'htmlspecialchars_recursive'), $input);
}
else if (is_scalar($input)) {
return htmlspecialchars($input, $flags, $encoding, $double_encode);
}
else {
return $input;
}
}
详细信息:
$ input =您的输入 array()或标量类型,例如整数,浮点数,字符串或布尔值。
$ flags = PHP Available flags constant description here
$ encoding =编码类型默认值:UTF-8
$ double_encode =根据您的需要,可以使用。 TURE或FALSE
函数调用
//It will convert htmlentities
$param = $this->htmlspecialchars_recursive($_REQUEST);
// print_r($param);
输出:
/*
array(
[whyiitgnq] => <ul><li><b>teste</b></li><li><b>tetst</b></li></ul><div><i><u>tets</u></i></div><div>tets</div><ol><li><b>tetst</b></li><li><b>tetst</b></li><li><b>test</b></li></ol>
[_wysihtml5_mode] => 1
[aid] => 12695
)
*/
答案 9 :(得分:0)
这是另一个使用array_walk的通用版本,其行为与htmlspecialchars关于参数的方式相同。
function htmlspecialchars_r($string,
int $flags = ENT_COMPAT | ENT_HTML401,
string $encoding = null,
bool $double_encode = true )
{
if ($encoding === null)
{
$encoding = ini_get("default_charset");
}
$filter = function(&$value, $flags, $params) {
$value = htmlspecialchars($value, $params['flags'], $params['encoding'], $params['double_encode']);
};
array_walk_recursive($string, $filter,
array(
'flags' => $flags,
'encoding' => $encoding,
'double_encode' => $double_encode,
)
);
return $string;
}