我将一组方法和参数传递给我的对象。阵列可以是具有任何数量的方法和/或参数的任何大小。在这些方法之间是参数。
编辑:对不起,这不清楚。方法后面的参数适用于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 {
??
}
当方法的数组值可变时,如何获取与方法匹配的参数的数组值?
答案 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);