array_map and htmlentities

3

我一直在尝试使用array_maphtmlentities()结合起来将字符转换为HTML实体,代码如下:

$lang = array_map('htmlentities', $lang);

我的数组看起来像这样:

$lang = array();
$lang['var_char1']['varchar2'] = 'Some Text';

但我一直遇到这些错误:

警告:htmlentities() 函数期望参数 1 是字符串类型,但实际提供的是数组类型, 在 /home/user/public_html/foo/lang/en.inc.php 的第1335行

有人知道可能出了什么问题吗?谢谢!


1
你正在使用嵌套数组。如果你使用普通的数组,它会起作用的。 - Pekka
你是否打算对多维数组 $lang 的每个元素执行 htmlentities() 函数?如果是这样,你需要使用递归而不是简单的 array_map() 函数。 - Michael Berkowski
6个回答

31

使用array_walk_recursive函数。array_map无法处理多维数组:

array_walk_recursive($lang, function (&$value) {
    $value = htmlentities($value);
});

6
因为$lang是一个二维数组,所以它不能工作。
对于二维数组,你需要使用for循环。
foreach($$lang as &$l):
    $l = array_map('htmlentities', $l);
}

1
$lang中的每个元素都是一个数组,因此您传递给array_map的函数应该将一个数组作为参数。但对于'htmlentities'来说情况并非如此,它需要一个字符串。
您可以:
$map_htmlentities = function(array) { return array_map('htmlentities', array); };

然后

$lang = array_map($map_htmlentities, $lang);

从 PHP 7.4 开始,您可以使用 lambda 表达式:
$lang = array_map(fn($arr) => array_map('htmlentities', $arr), $lang);

1

if you like quotes


function stripslashes_array(&$arr) {
    array_walk_recursive($arr, function (&$val) {
        $val = htmlentities($val, ENT_QUOTES);
    });
}

在POST、GET、DLL中使用多维数组

stripslashes_array($_POST);

stripslashes_array($_GET);

stripslashes_array($_REQUEST);

stripslashes_array($_COOKIE);

1

$lang['var_char1']['varchar2'] 定义了一个多维数组,因此 $lang 的每个元素也是一个数组。array_map() 遍历 $lang,将一个数组传递给 htmlentities() 而不是一个字符串。


1

array_map()不支持递归。如果你知道你的数组总是两层深度,你可以循环遍历它并在子数组上使用array_map。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接