array_walk or array_map?

10

我目前正在使用array_map对数组元素应用回调函数。但是我希望能像array_walk一样传递参数给回调函数。

我想我可以直接使用array_walk,但我需要返回值是一个数组,就像使用array_map时一样,而不是TRUE或FALSE。

所以,是否可能在使用array_map的同时传递参数给回调函数?或者让array_walk返回一个数组而不是布尔值?


1
https://dev59.com/t3A75IYBdhLWcg3wK10p - Jürgen Paul
4个回答

7
你不需要它返回一个数组。
而是用以下方式:
$newArray = array_function_you_are_looking_for($oldArray, $funcName);

It's:

$newArray = $oldArray;
array_walk($newArray, $funcName);

但是,如果我使用array_walk,返回值将是TRUE或FALSE。我希望返回值像array_map一样是一个数组。 因此,要么找到一种使用array_map传递参数的方法,要么找到一种使array_walk返回数组而不是布尔值的方法。 - Kemal Fadillah
1
array_walk 在调用它的原始数组上进行编辑吗?如果是的话,那就太棒了。 - sdleihssirhc
这是因为array_walk会对数组进行修改。在之后尝试使用print_r($newArray);,注意Tomalak并没有使用$arr = array_walk($newArray, $funcName);。TRUE只是表示操作成功,并且你可以使用插入的数组。 - Joshua - Pendo
是的,array_walk会修改原始数组。这就是为什么我需要它返回一个数组而不是布尔值的原因。 - Kemal Fadillah
@PENDO 这不是取决于提供的函数吗?我尝试使用 array_walk,只有在我定义的“walker”函数使用 & 符号时才会修改原始数组:function walker(&$val) { ... } - sdleihssirhc
显示剩余3条评论

6
如果您想返回一个数组,只需使用array_map。要向array_map添加其他参数,请使用"use",例如:
array_map(function($v) use ($tmp) { return $v * $tmp; }, $array);

或者

array_map(function($v) use ($a, $b) { return $a * $b; }, $array);

2

根据需要传递的参数类型,您可以创建一个包装函数:

$arr = array(2, 4, 6, 8);
function mapper($val, $constant) {
    return $val * $constant;
}

$constant = 3;
function wrapper($val) {
    return mapper($val, $GLOBALS['constant']);
}

$arr = array_map('wrapper', $arr);

这似乎太简单了,让人难以置信。我怀疑我们需要更多的背景信息才能真正帮助。

0

为了更详细地解释Hieu的优秀答案,您还可以使用原始数组的$key => $value对。以下是一个示例,其中包含从评论部分http://php.net/manual/en/function.array-map.php借用的一些代码。

以下将使用“use”并包括一个新数组作为附加参数。

下面的代码将获取“b_value”和“d_value”,并将它们放入一个新数组$new_arr中(这是一个无用的示例,只是为了说明一点)。

// original array
$arr = ("a" => "b_value",
"c" => "d_value"); 

// new array
$new_arr = array();

array_map(function($k,$v) use (&$new_arr) { $new_arr[] = $v;}, array_keys($arr), $arr);

^ $k 代表键名,$v 代表数值

$new_arr 的 print_r 结果为

Array
(
    [0] => b_value
    [1] => d_value
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接