我正在向我的对象传递一个方法和参数数组。数组可以是具有任意数量的方法和/或参数的任何大小。在方法之间是参数。
编辑:抱歉,这不清楚。方法后面的参数适用于该方法。因此,在下面的第一个示例中
,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);