2011-05-30 62 views
1

我正在研究CMS,并且正在寻找将函数参数列表转换为数组的方法。例如:将函数参数列表转换为数组

function testfunction($param1, $param2){ 
$string = "Param1: $param1 Param2: $param2"; 
return $string; 
} 

$funcname = 'testfunction'; 
$params = "'this is, parameter 1', 'this is parameter2'"; 

//This doesnt work, sends both parameters as the first, dont know why. 
echo call_user_func($funcname, $params); 


//So I want to split the parameter list: 
$paramsarray = preg_split('%Complex Regex%', $params); 

//And call thusly: 
echo call_user_func_array($funcname, $paramsarray); 

我不知道在这里使用什么样的正则表达式的.... 我只能通过爆炸“”但会爆炸包含在字符串,数组等等所有逗号。所以我需要一个正则表达式来做到这一点,我认为正则表达式,但它似乎会有很多规则。

+0

好的,我知道call_user_func_array,这个例子非常简单。函数名称和参数都是动态的,并且不是以数组的形式输入的。这就是为什么我必须将它们分成一个数组。我不知道为什么call_user_func不会为我工作,有多个参数? – Ben 2011-05-30 19:38:36

回答

2

我想,如果你真的想从一个字符串(而不是像其他人则建议一个数组)开始,你可以这样做:

在PHP 5.3:

$params = "'this is, parameter 1', 'this is parameter2'"; 
$paramsarray = str_getcsv($params, ',', "'"); 

在PHP 5.1 /5.2:

$fp = fopen('php://temp', 'w+'); 
fwrite($fp, $params); 
fseek($fp, 0); 
$paramsarray = fgetcsv($fp, 0, ',', "'"); 

print_r($paramsarray); 

...并获得:

Array 
(
    [0] => this is, parameter 1 
    [1] => this is parameter2 
) 

...然后使用call_user_func_array

如果你想使用更复杂的类型(例如:数组或对象),那将是一个真正的挑战。您可能必须使用Tokenizer

+0

谢谢!现在这个工作,我甚至不知道Tokenizer的功能......我将不得不进一步研究。对于像这样的参数:testfunction('this is param1',array('one'=>'something','two'=>'something else'),'and more more',$ someclass-> somefunction('more parameters' )); – Ben 2011-05-30 19:47:45

1

也许你可以使用func_get_args这个?

此外,call_user_func我认为应该这样调用:

call_user_func('functionName', $param1, $param2); 
1

$params是(在你的情况下)一个变量,它包含一个单一的值string。它的而不是数组或任何其他复杂类型。我认为,你甚至不需要你的%Complex Regex%

$funcname = 'testfunction'; 
$params = "'this is, parameter 1', 'this is parameter2'"; 

foreach ($params as &$param) $param = trim($param, "' \n\r\t"); 

echo call_user_func_array($funcname, $params); 
+0

是的,但这只是一个非常简单的例子。我可以在某个时候定义数组。所以这就产生了一个问题......在这种情况下仍然不知道如何去做。 – Ben 2011-05-30 19:34:46

+0

如果你已经有一个数组,你可以省略'explode()'的东西,因为这只是将字符串分割成一个数组。有趣的是'call_user_func_array()'。 – KingCrunch 2011-05-30 19:36:31

1

听起来像是你想call_user_func_array来代替。

$params = array('this is, parameter 1', 'this is parameter2'); 
$funcname = 'testfunction'; 

echo call_user_func_array($funcname, $params);