对数组的每个元素执行函数

问题描述 投票:0回答:7

我知道

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);
}

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

php arrays function-call
7个回答
42
投票

传递给

array_walk
的回调函数预计接受两个参数,一个用于值,一个用于键:

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

但是

mysql_real_escape_string
希望第二个参数是资源。这就是您收到该错误的原因。

使用

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

array_map('mysql_real_escape_string', $_POST);

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

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

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

6
投票

我知道OP要求调用一个函数,但是在您实际上不需要调用函数的情况下,您可以定义一个匿名函数

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

3
投票

这是因为 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');

3
投票
除非你先建立了 mysql 连接,否则

mysql_real_escape_string()
将不起作用。 它如此酷的原因是它会以适合表类型的方式转义字符。 第二个[可选]参数是对 mysql 连接的引用。

$_POST
始终设置为
key->value
。 所以,你
array_walk
打电话给
mysql_real_escape_string(value, key)
。 请注意,第二个参数不是引用。

这就是它不起作用的原因。 上面已经提到了几种解决方案。


3
投票

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 不正确,但我想您会明白总体思路。


0
投票

PHP 7.4 风格:

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

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

-2
投票

我在使用已接受的答案时遇到了麻烦,因为它因我无法解决的原因而导致了我的错误。因此,对于任何在 array_walk 或 array_map 方面遇到问题的人,我发现这很有效。

foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);
© www.soinside.com 2019 - 2024. All rights reserved.