Php 将函数应用于数组的简单方法

Php 将函数应用于数组的简单方法,php,arrays,Php,Arrays,我知道array\u walk()和array\u map()。然而,当像这样(在一个旧项目上)使用前者时,它失败了 array_walk($_POST, 'mysql_real_escape_string'); 警告:mysql\u real\u escape\u string() 期望参数2是资源, 给定字符串 所以我选择了这个稍微难看一点的版本 foreach($_POST as $key => $value) { $_POST[$key] = mysql_real_esc

我知道
array\u walk()
array\u map()
。然而,当像这样(在一个旧项目上)使用前者时,它失败了

array_walk($_POST, 'mysql_real_escape_string');
警告:mysql\u real\u escape\u string() 期望参数2是资源, 给定字符串

所以我选择了这个稍微难看一点的版本

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

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

这是因为mysql\u real\u escape\u字符串有两个参数,都是字符串

:

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

你可以

function myescape($val)
{
    return mysql_real_escape_string($val);
}
。。。然后

array_walk($_POST, 'myescape');

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

通常,funcname具有两个参数。数组参数的值为第一个,键/索引为第二个

但期望第二个参数是资源。这就是为什么你会犯这样的错误

相反,它只获取每个项的值并将其传递给给定的回调函数:

array_map('mysql_real_escape_string', $_POST);
第二个参数将被省略,因此使用最后打开的连接

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

表示array_walk将使用两个参数(值和键)调用函数。您应该编写一个新函数来包装mysql\u real\u escape\u字符串。比如:

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

array_walk($_POST, 'wrapper');

如果我的PHP不正确,很抱歉,但我想你会明白我的意思。

mysql\u real\u escape\u string()
除非你先建立了mysql连接,否则无法工作。它之所以如此酷,是因为它将以适合表格类型的方式转义字符。第二个[可选]参数是对mysql连接的引用

$\u POST
始终设置为
键->值
。因此,您
array\u walk
调用
mysql\u real\u escape\u string(value,key)
。请注意,第二个参数不是引用


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

我在使用被接受的答案时遇到了问题,因为它导致了我的错误,原因是我无法解决。因此,对于任何在array_walk或array_map方面有困难的人,我发现这是可行的

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

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

PHP 7.4样式:

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

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

丑陋的版本真的有效吗?那么
array\u walk()
会将每个数组值映射到函数的所有参数吗?那不是有点。。奇怪的我可以说“请只使用第一个参数”吗?第一个问题的答案是否定的。我想myescape这里缺少了第二个参数:$key你的意思是,
array\u walk()
的第二个参数应该是
'wrapper'
。你问过问题是什么吗?这样一来,这个答案只是在散布一个神话,即
array\u map()
存在某种问题-1@bažmegakapa这并没有传播任何神话。这只是为那些不太熟悉php函数的人提供了一个更容易理解的替代解决方案。OP要求提供一种将函数应用于数组的简单方法,它可以。。。你到底在说什么?我甚至没有提到你作为答案发布的相同代码已经出现在问题中了……因此,用几句话来说:
array\u map()
array\u walk()
没有问题。你正在谈论一些奇怪的错误出现,99%是因为你做错了什么。您无法修复它,因此建议其他人使用
foreach
,而不是修复他们的代码或花一点时间了解优化的数组函数。我对foreach的
没有问题,只是推理而已。没有侮辱的意思。@bažmegakapa很公平,yes只是说我无法理解,但这是一种行之有效的方法。我并没有提倡它胜过任何其他方法,也没有引用array_map()和array_walk()的任何问题,只是说这对我来说真的很有效。
array_map()
也是一个更好的选择,因为它不修改原始数组,它在应用函数后返回一个新数组。
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

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