使用适当数量的参数检查数组键参数和调用方法

时间:2014-05-06 15:15:53

标签: php arrays foreach

我有一个类,其方法采用不同的参数。我得到了一个带有方法的数组,也有不同的参数。

我需要使用适当数量的参数调用方法才能工作。如果数组中的键没有值,则应始终将$input作为第一个参数传递。

有谁知道我做错了什么或者需要做些什么来实现它?

$arr = ['trim', 'between' => [6, 254]];

我尝试失败

foreach ($arr as $method) {
    if (count($method) === 0) {
        $this->$method($input);
    } elseif (count($method) === 1) {
        $this->$method($input, $method[0]);
    } elseif (count($method) === 2) {
        $this->$method($input, $method[0], $method[1]);
    }
}

错误

Fatal error: Method name must be a string in (..) on line N

方法

private function trim($input) //1 param
{
    $this->input = trim($input);
}

private function max($input, $max) //2 params
{
    if (!(strlen($input) <= $max)) {
        $this->errors[] = __FUNCTION__;
    }
}

private function between($input, $min, $max) //3 param
{
    if (!(strlen($input) > $min && strlen($this->input) < $max)) {
        $this->errors[] = __FUNCTION__;
    } 
}

2 个答案:

答案 0 :(得分:2)

您可以使用call_user_func_array的可变数量的参数轻松地动态调用您想要的任何方法。只需要处理一些细节。

首先,$arr的格式很方便,但不一致。有时方法名称是值(例如trim),有时它是键(例如between)。你需要规范化事物:

foreach ($arr as $key => $value) {
    if (is_int($key)) {   // $key => 'trim'
        $method = $value;
        $arguments = [$input];
    }
    else {                // 'trim' => [...]
        $method = $key;
        $arguments = array_merge([$input], is_array($value) ? $value : [$value]);
    }

既然你$method$arguments干净利落,那么最后一步是微不足道的:

    call_user_func_array([$this, $method], $arguments);

答案 1 :(得分:0)

了解错误 $ arr = [0 =&gt; 'trim','between'=&gt; [6,254]];

你迭代值所以在$ method中得到1)'trim',2)[6,254](不是'介于'之间)