【问题标题】:Why does one array_walk work and the other array_walk does not?为什么一个 array_walk 工作而另一个 array_walk 不工作?
【发布时间】:2014-07-10 19:17:33
【问题描述】:

我正在尝试从用户提交的表单中转换一些 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 给我预期结果的函数?

【问题讨论】:

  • 使用array_walk($_POST, sanitize_msword_characters);,这似乎更接近预期的语法。
  • 第一个示例不起作用,因为参数的顺序错误。在此处查看array_walk() 的文档。第一个参数是数组,第二个参数是回调函数。此外,您的回调函数应该是函数的名称而不是字符串(即sanitize_msword_characters 而不是"sanitize_msword_characters")。
  • @njzk2 我在玩array_map时切换了参数,它显然具有与array_walk相反的参数...更改语法后,它仍然不起作用。
  • 更新:我让 array_walk 工作,但前提是它调用的函数在同一个文件中。如果该函数在另一个文件中并包含在内,则它不起作用,并且不会产生错误。所以,我想问题是如果 array_walk 调用的函数在另一个文件中,为什么它不能工作?

标签: php arrays


【解决方案1】:

两个问题。首先,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

【讨论】:

  • 谢谢,但还是不行。玩array_map的时候切换了参数……改了语法后还是不行。我可以让它工作的唯一方法是在我的 OP 中使用第二个示例。
  • 效果很好,请参阅演示。也许你的$_POST 不包含你的想法或者是多维的?
  • 感谢演示。我发现如果我在同一个文件中包含该函数,它确实有效,但是当我在我的 functions.php 文件中包含该函数时,它不起作用。知道什么会阻止它不在同一个文件中工作吗?我检查了其他可能与之冲突的同名函数,但没有找到。
  • error_reporting(E_ALL); ini_set('display_errors', '1');
  • 谢谢...有一些注意事项:未定义变量:错误但与 array_walk 无关。我不知道为什么 array_walk 在单独的文件中时看不到我的函数。使用 require_once 包含 functions.php。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多