将函数应用于数组的简便方法

时间:2010-02-16 02:36:37

标签: php arrays

我知道array_walk()array_map()。但是当像这样使用前者时(在旧项目上)它失败了

array_walk($_POST, 'mysql_real_escape_string');
  

警告:mysql_real_escape_string()   期望参数2是资源,   字符串。

所以我选择了这个稍微丑陋的版本

foreach($_POST as $key => $value) {
    $_POST[$key] = mysql_real_escape_string($value);
}

那么为什么第一种方式不起作用?将数组值映射到函数的最佳方法是什么?

7 个答案:

答案 0 :(得分:31)

传递给array_walk的回调函数应该接受两个参数,一个用于值,一个用于键:

  

通常, funcname 采用两个参数。 array 参数的值是第一个,键/索引是第二个。

mysql_real_escape_string期望第二个参数是资源。这就是你得到这个错误的原因。

使用array_map代替,它只获取每个项目的值并将其传递给给定的回调函数:

array_map('mysql_real_escape_string', $_POST);

将省略第二个参数,因此使用最后打开的连接。

如果需要传递第二个参数,则需要将函数调用包装在另一个函数中,例如: anonymous function

array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);

答案 1 :(得分:2)

这是因为mysql_real_escape_string被赋予了两个参数,都是字符串。

http://php.net/manual/en/function.mysql-real-escape-string.php

http://www.phpbuilder.com/manual/en/function.array-map.php

  

array_map()返回一个数组   包含arr1的所有元素   应用回调函数后   每个人。参数个数   回调函数接受   应该匹配数组的数量   传递给array_map()

你可以做到

function myescape($val)
{
    return mysql_real_escape_string($val);
}

......然后

array_walk($_POST, 'myescape');

答案 2 :(得分:2)

http://php.net/manual/en/function.array-walk.php表示array_walk将使用2个参数(值和键)调用该函数。你应该编写一个新函数来包装mysql_real_escape_string。类似的东西:

function wrapper($val, $key){
    return mysql_real_escape_string($val);
}

然后:

array_walk($_POST, 'wrapper');

很抱歉,如果我的PHP不正确,但我认为你会理解这一点。

答案 3 :(得分:2)

除非您先建立了mysql连接,否则

mysql_real_escape_string()将无效。它之所以如此酷,是因为它会以适合表格类型的方式转义字符。第二个[可选]参数是对mysql连接的引用。

$_POST始终设置为key->value。因此,array_walk来电mysql_real_escape_string(value, key)。请注意,第二个参数不是引用。

这就是为什么它不起作用。上面已经提到了几种解决方案。

答案 4 :(得分:1)

我知道OP要求调用函数,但是在您不需要调用函数的情况下,您可以定义anonymous one

$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});

答案 5 :(得分:0)

PHP 7.4样式:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

array_map(fn($string) => mysqli_real_escape_string($string, $link), $_POST);

答案 6 :(得分:-2)

我无法使用已接受的答案,因为它导致我出错,原因是我无法解决。因此,对于任何遇到array_walk或array_map问题的人,我发现这可以工作。

foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);