为什么一个array_walk工作而另一个array_walk不工作?

时间:2014-07-10 19:17:33

标签: php arrays

我正在尝试从用户提交的表单转换某些MS Word字符。

使用array_walk迭代$ _POST变量似乎是执行此操作的最佳方法,但是当我调用“sanitize_msword_characters”函数时它无效。

以下array_walk调用我的“sanitize_msword_characters”函数不会导致替换任何字符:

array_walk('sanitize_msword_characters', $_POST);

function sanitize_msword_characters($data = '')
{
    $data= str_replace("‘", "'", $data);
    $data= str_replace("’", "'", $data);
    $data= str_replace("”", '"', $data);
    $data= str_replace("“", '"', $data);
    $data= str_replace("–", "-", $data);
    $data= str_replace("—", "--", $data);
    $data= str_replace("…", "...", $data);

    return $data;
}

以下array_walk确实有效,但我必须将它放在处理表单的每个php文件中:

array_walk($_POST, function(&$value, &$key) {
    $value = str_replace("‘", "'", $value);
    $value = str_replace("’", "'", $value);
    $value = str_replace("”", '"', $value);
    $value = str_replace("“", '"', $value);
    $value = str_replace("–", "-", $value);
    $value = str_replace("—", "--", $value);
    $value = str_replace("…", "...", $value);
});

我尝试将上面的array_walk代码放在一个函数中(见下文),但是它没有进行替换,尽管没有产生错误。

function sanitize_msword_characters($data = '')
{
    array_walk($data, function(&$value, &$key) {
        $value = str_replace("‘", "'", $value);
        $value = str_replace("’", "'", $value);
        $value = str_replace("”", '"', $value);
        $value = str_replace("“", '"', $value);
        $value = str_replace("–", "-", $value);
        $value = str_replace("—", "--", $value);
        $value = str_replace("…", "...", $value);
        $value = str_replace("–", "--", $value);
    });

    return $data;
}

我的问题是如何使用array_walk为我提供预期结果的函数?

2 个答案:

答案 0 :(得分:0)

两个问题。首先,array_map调用中的参数顺序是错误的。其次,您需要将项值作为参考传递以进行更改:

array_walk($_POST, 'sanitize_msword_characters');

function sanitize_msword_characters(&$data)
{
    $data= str_replace("‘", "'", $data);
    $data= str_replace("’", "'", $data);
    $data= str_replace("”", '"', $data);
    $data= str_replace("“", '"', $data);
    $data= str_replace("–", "-", $data);
    $data= str_replace("—", "--", $data);
    $data= str_replace("…", "...", $data);
}

我会缩短它:

function sanitize_msword_characters(&$data)
{
    $s = array("‘","’","”","“","–","—","…");
    $r = array("'","'",'"','"',"-","--","...");
    $data = str_replace($s, $r,  $data);
}

DEMO

答案 1 :(得分:0)

我终于明白了。包含在单独的函数文件中时array_walk不工作的原因是因为我的functions.php文件的格式是1252(ANSI-Latin I)。我将它转换为UTF-8,现在它可以工作了。当格式为1252(ANSI-Latin I)时,特殊的MS字符未被正确编码,导致array_walk无法正常工作。