PHP:如何对数组数组执行htmlspecialchar()?

PHP:如何对数组数组执行htmlspecialchar()?,php,html,arrays,web-applications,Php,Html,Arrays,Web Applications,如何在数组对象数组上运行PHP函数htmlspecialchars() 我有以下代码: $result_set = Array ( [0] => Array ( [home_id] => 1 [address] => 4225 Nasmyth Dr [city] => Plano [state] => TX [zip] =&

如何在数组对象数组上运行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()期望参数2很长,字符串给定


更新2

当我尝试时:

function cleanOutput(&$value) {
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));
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);
我得到了以下不想要的输出:

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');
}
print_r($result_set);
print('-------');
print_r(array_walk_recursive($result_set, "cleanOutput"));
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' : []}
您可以使用在每个条目上运行该方法

$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);
  }
}
或者,您可以使用
数组\u walk\u recursive()


请注意,此方法通过引用更改$myArray对象,因此无需将输出分配给新变量。

您可能希望使用Jonathon Sampson建议的数组映射,另一种选择是


不同之处在于,array\u map返回一个数组副本,其中函数应用于每个元素,而array\u walk直接在您提供的数组上操作。

如果要使用array\u map并传递函数参数,可以创建自己的函数并将其用作回调:

 function cleanhtml($dirtyhtml) {
       return htmlspecialchars($dirtyhtml, UTF-8);
  }

  $cleaned = array_map("cleanhtml", $myArray);

如果要向回调函数传递多个参数,则不需要创建自己的函数

根据:

array数组\u映射(回调$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'));

使其适用于多维阵列:

function secure($val) {
    return (is_array($val))?array_map('secure',$val):htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
}
它可以工作,在没有上次使用的数组的情况下在数组上调用其自身,如果它不是数组,则将其传递给htmlspecialchars函数

输入:
Array([0]=>test<[1]=>Array([test>]=>)[2]=>Array([0]=>test[1]=>[2]=>Array([0]=>bigtest))

输出:
Array([0]=>test[1]=>Array([test>]=>test?[2]=>Array([0]=>test[1]=>test[2]=>Array([0]=>bigtest)))


//这将改变来源

本页上的许多答案要么不够充分,要么过时,要么使用了错误的或参数。这是一个递归修复数组中所有标量值的函数

htmlspecialchars_recursive()
验证类功能

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;
    }
}
详细信息:

/*
        array(
            [whyiitgnq] => &lt;ul&gt;&lt;li&gt;&lt;b&gt;teste&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;i&gt;&lt;u&gt;tets&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;tets&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;test&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;
            [_wysihtml5_mode] => 1
            [aid] => 12695
        )
        */
$input=您的输入array()或整数、浮点、字符串或布尔等标量类型。

$flags=

$encoding=编码类型默认值:UTF-8

$double_encode=根据您的需要,您可以使用正确或错误

函数调用

 //It will convert htmlentities
$param =  $this->htmlspecialchars_recursive($_REQUEST);
// print_r($param);
输出:

/*
        array(
            [whyiitgnq] => &lt;ul&gt;&lt;li&gt;&lt;b&gt;teste&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;i&gt;&lt;u&gt;tets&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;tets&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;test&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;
            [_wysihtml5_mode] => 1
            [aid] => 12695
        )
        */

这里是另一个使用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;
}

$result\u set
包含哪些内容?$result\u set是我查询的结果数据库中的一个数组,用于查找在执行数组映射时发生的情况('htmlspecialchars',$result\u set,array(ENT_引号,'UTF-8'))?htmlspecialchars或array_map是否有错误?$result_集合中的一个元素是什么样子的?迄今为止提供的所有解决方案都假定$result_set是字符串数组。在脚本的第二行,我猜$result\u set是一个散列数组。@bish,我已经更新了原始post如果我想将数组传递给htmlspecialchars,我该如何使用array\u map()?意思是,如何将ENT_引号中的参数“UTF-8”传递给htmlspecialchars?意思是“array_map”(“htmlspecialchars”),$result_set)'不允许我传入ENT_QUOTES和UTF-8TeddyR的参数,生成自己的函数,用这些参数调用htmlspecialchars,然后调用您的函数。为什么这不起作用-->数组映射('htmlspecialchars',$result_set,array(ENT_QUOTES,'UTF-8')??我收到以下错误,“htmlspecialchars()预期参数2较长,字符串给定“当使用rray_映射('htmlspecialchars',$result_set,array(ENT_引号,'UTF-8'))时,您实际上不需要自己的函数,array_映射可以将多个参数传递给目标回调函数。array array_映射(回调$callback,array$arr1[,array$…])您唯一想创建自己的对象的时候是对数组中的每个对象执行多个操作。我从上面的注释中注意到了这一点。但是php文档并不是很清楚。一个简单的示例将非常有用。他们所有的示例都假定用户编写的函数。这会生成以下错误:htmlspecialchars()在使用以下代码时希望参数1是字符串:“当我使用以下代码时:函数cleanhtml($dirtyhtml){返回htmlspecialchars($dirtyhtml,ENT_引号,'UTF-8');}$cleaned=array_map(“cleanhtml”,“myArray”);这不起作用。我收到错误:array_map()[]:参数#3应该是一个数组所以,我被难住了。因为你的方法和Jonathan的方法都不起作用。两者都会产生错误,请参阅我的评论以了解确切的错误。我已经修改了它,它似乎对我有效,但测试它,看看它是否对你正确输出。出于某种原因,如果我将两个参数放在同一个数组中,它会声明“htmlspecialchars()“期望参数2长”。明白了。@travover,在第二个示例中,我收到以下错误:“htmlspecialchars()期望参数1为字符串,数组g
/*
        array(
            [whyiitgnq] => &lt;ul&gt;&lt;li&gt;&lt;b&gt;teste&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;i&gt;&lt;u&gt;tets&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;tets&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;tetst&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;test&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;
            [_wysihtml5_mode] => 1
            [aid] => 12695
        )
        */
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;
}