2011-05-30 129 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);