PHP 方法和参数数组


PHP Array of Methods and Parameters

我正在向我的对象传递一个方法和参数数组。数组可以是具有任意数量的方法和/或参数的任何大小。在方法之间是参数。

编辑:抱歉,这不清楚。方法后面的参数适用于该方法。因此,在下面的第一个示例中

,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 {
        ??
    }
当方法的数组值

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

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

$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] 匹配。

你可以转

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];
    }
}

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

我会使用 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

据我了解这个问题,您有一个方法和参数数组,并且您想将它们分开 - 大概是单独的数组。

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

<?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()只能看到公共方法。它也可以在对象内部使用,以获得受保护和私有方法。这取决于您的确切用例。

希望这有帮助。

在构建数组时$parameters构建数组更有效$methods。但是,如果出于某些未知的原因,您希望保持代码原样,这里有一种方法可以做到这一点:

$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);