PHP方法和参数数组

时间:2016-01-20 21:46:33

标签: php arrays

我将一组方法和参数传递给我的对象。阵列可以是具有任何数量的方法和/或参数的任何大小。在这些方法之间是参数。

编辑:对不起,这不清楚。方法后面的参数适用于THAT方法。所以在下面的第一个例子中,method1有两个参数(param1和param2),method2有两个参数(param1和param2),method3有一个参数(param)。

以下是一些例子:

array = ["method1","param1","param2","method2","param1","param2","method3","param"];
array = ["method1","param1","param2","method2","param"];
array = ["method","param"];

我可以使用method_exists从数组中提取方法,但我试图从数组中提取参数。这是我到目前为止所得到的:

    // Loop thru $array to find methods
    $methods = array();
    for($i=0; $i < count($array); $i++) {
        if(method_exists($this,$array[$i]) === TRUE) {
               $methods[] = $i;
        }
    }
    // Get parameters for methods

    // If there is only one method take the remaining array values
    // else get the parameters in between the methods
    if(count($methods) == 1) {
        $parameters = array_slice($array,1,count($array));  
    } else {
        ??
    }

当方法的数组值可变时,如何获取与方法匹配的参数的数组值?

5 个答案:

答案 0 :(得分:1)

你很接近,但我相信你只想处理一次数组。请记住 - 您的所有数组值都是“方法”或“参数”。因此,如果您能够找到“方法”,您还可以找到“参数”。

$methods = array();
$parameters = array();
$curParameters = null;
for($i=0; $i < count($array); $i++) {
    if(method_exists($this,$array[$i]) === TRUE) {
           //associate last set of paremeters with method
           if ($curParameters != null) {
               $parameters[] = $curParameters;
           }
           //new method, new curParams
           $methods[] = $i;
           $curParameters = array();
    } else {
         //$array[$i] must be a parameter for the last method found
         $curParameters[] = $array[$i];
    }
}
//need to save the last set params founds
$parametres[] = $curParameters

完成解析后,您应该有两个数组。第一个数组是$methods,第二个数组是$parameters。这些数组应匹配1到1,这意味着$parameters[x]应与$methods[x]匹配。

答案 1 :(得分:0)

你可以转过来

for($i=0; $i < count($array); $i++) {
    if(method_exists($this,$array[$i]) === TRUE) {
           $methods[] = $i;
    }
}

$j = 0;
for($i=0; $i < count($array); $i++) {
    if(method_exists($this,$array[$i]) === TRUE) {
           $methods[] = $i;
           $j++;
    }
    else {
        $parameters[$j][] = $array[$i];
    }
}

答案 2 :(得分:0)

你可以在这里做的是检查你提取的值是否在你的方法数组中。如果是,那么你知道它是一个方法,而不是一个参数。如果不是那么你就知道它是一个参数。

我会使用array_search() php方法来完成此任务。

所以你的代码看起来像是:

for($x=0;$x<count($array);$x++)
{
    if( array_search($array[$x], $methods) !== false)
    {
         //This is a Parameter
    }
}

您可以在此处找到更多信息:http://php.net/manual/en/function.array-search.php

答案 3 :(得分:0)

据我所知,你有一系列的方法和参数,你想把它们分开 - 大概是分开的数组。

如果是这样,您可以尝试以下简化示例:

<?php

// example object with some public methods...
class Foo
{
    function method1() {}
    function method2() {}
    function method3() {}
}

// list of methods and params
$array = [
    'method1', 
    'param1', 
    'param2', 
    'method2', 
    'param3', 
    'method3', 
    'param4', 
    'param5',
];

// get a list of Foo's methods
$methods = get_class_methods('Foo');

// array_diff to get the params only
$params = array_diff($array, $methods);

print_r($params);

收率:

Array
(
    [1] => param1
    [2] => param2
    [4] => param3
    [6] => param4
    [7] => param5
)

YMMV - 此示例位于对象的上下文之外,因此get_class_methods()只能看到公共方法。它可以在对象内部使用以获得受保护和私有方法。这取决于您的确切用例。

希望这有帮助。

答案 4 :(得分:0)

构建$ methods数组时构建$ parameters数组效率更高。但是,如果由于某些未知的原因,您希望保持代码不变,这是一种方法:

$methods = array();
for($i=0; $i < count($array); $i++) {
    if(method_exists($this,$array[$i]) === TRUE) {
           $methods[] = $i;
    }
}

if(count($methods) == 1) {
    $parameters = array_slice($array,1,count($array));  
} else {
    $parameters = array();
    for ($k=0; $k < (count($methods) - 1); $k++)
        $parameters[$k] = array_slice($array,$methods[$k]+1,$methods[$k+1]-$methods[$k]-1);
    $parameters[$k] = array_slice($array,$methods[$k]+1,count($methods)-$methods[$k]-1);
}
print_r($parameters);