使用带有多参数函数的array_map?

时间:2016-07-08 12:01:08

标签: php array-map

我正在构建一个递归函数,它为任何深层嵌套数组执行任何函数。例如,我想在这里STRIPSLASH所有数组值:

function RECURSER($array,$function_name){ 
   return is_array($array) ? array_map('RECURSER', $array, $function_name) : $function_name($array); 
}

但是当我执行时:

recursive_for_array_value( $MY_ARRAY, 'stripslashes')

上述功能无法将第二个参数发送到array_map

3 个答案:

答案 0 :(得分:2)

现在,我将首先说我可能永远不会在任何实际项目中使用它,但这是一个有趣的挑战/问题,T.Todua的答案行之有效,但可以避免使用$GLOBALS。 / p>

我的立场是,与递归调用array_walk_recursive()相比,array_map()是一个更合适的函数-毕竟,array_walk_recursive()专门用于访问叶节点并避免了检查当前节点的繁琐工作项目的类型为“数组”。 use()可以有效地将函数字符串传递到递归函数的作用域中。

*注意:您只能将函数字符串作为a string in a SUPER fringe case where the function prints to screen AND requires two arguments -- the first arg being the element value and the second arg being the element key传递。

由于只想处理元素值并通过引用对其进行修改,因此&$v是必需的。

以下是有关检查动态函数名称的相关文章:What exactly is the difference between the is_callable and function_exists in PHP?

这是我的替代方法:

代码:(Demo

$multidim_array = ['a' => [' \one ', ['b' => 'two\\', [['c' => 'thr\ee']]]]];
$func = 'stripslashes';
if (function_exists($func)) {
    array_walk_recursive($multidim_array, function(&$v)use($func){$v = $func($v);});
    var_export($multidim_array);
} else {
    echo "not callable";
}

如果您想进一步深入研究,您可以可以通过设置传递多个参数的选项来扩展其潜在用途:

代码:(Demo

$func = 'strpos';
if (function_exists($func)) {
    $more = true;
    $param2 = 'o';
    array_walk_recursive($multidim_array, function(&$v)use($func, $more, $param2) {
        if ($more) {
            $v = $func($v, $param2);
        } else {
            $v = $func($v);
        }
    });
    var_export($multidim_array);
} else {
    echo "um... I'm not calling $func";
}

最后,我全心全意不赞成的方法是使用eval() -因为您可以看到一英里远的尾巴,角和干草叉。

  

注意   eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证了除了使用此构造方法外没有其他选择,请特别注意不要在未经事先正确验证的情况下将任何用户提供的数据传递到其中。

这可行,但实际上不应该被娱乐:

if (function_exists($func)) {
    array_walk_recursive($multidim_array, function(&$v)use($func) {eval("\$v = $func(\$v);"); });
    var_export($multidim_array);
} else {
    echo "um... I'm not calling $func";
}

答案 1 :(得分:1)

array_map接受一个函数和多个数组作为参数。也许您需要通过匿名函数递归调用递归。

function RECURSER($array,$function_name){ 
     if (is_array($array))
        return array_map(function ($element) use ($function_name) {
           return RECURSER($element,$function_name);
       },$array);                
   return $function_name($array);
}

stripslashes作为单行PHP函数的用例可以写成:

array_walk_recursive($array, function (&$value) { $value = stripslashes($value); });

答案 2 :(得分:1)

任何功能的RECURSOR:

rubygems 1.3.7

代码:

$result= Recursiver_of_Array($array, 'stripslashes');