【问题标题】:How do you replicate an array whilst keeping the same keys?如何在保留相同键的同时复制数组?
【发布时间】:2009-09-11 15:06:06
【问题描述】:

好的。我编写了一个简单(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 字符取回所有​​值。因此,显然,数组中的键将是数据库字段的名称,而我目前的功能是将它们替换为数值。

是的,我需要取回传递给函数的相同参数,但数组键仍然完好无损(如果传递了一个数组)。

希望这是有道理的,建议表示赞赏。

【问题讨论】:

    标签: php arrays logic html-injections


    【解决方案1】:

    您可以使用递归而不是嵌套加载 foreaches:

    function html_safe($input) {
        if (is_array($input)) {
            return array_map('html_safe', $input);
        } else {
            return htmlspecialchars($input);
        }
    }
    

    【讨论】:

    • 嘿,这在本地工作,但是当我部署到开发环境时,我收到以下错误:警告:array_map() [function.array-map]:第一个参数“html_safe”应该是NULL 或第 16 行 ...\www\include\security.php 中的有效回调
    • @Evernoob:奇怪,PHP版本是一样的吗?
    【解决方案2】:

    好吧,我想我自己已经弄明白了……

    我的 foreach 循环没有指定任何键,例如它们是:

    foreach($array_val as $val)
    

    代替:

    foreach($array_val as $key => $val)
    

    在这种情况下,我可以在输出数组中保留数组键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2015-06-30
      • 2017-06-11
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多