Преобразовать список аргументов функции в массив - PullRequest
1 голос
/ 30 мая 2011

Я работаю над 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);

Я не знаю, какое регулярное выражение использовать здесь .... Я мог бы просто взорваться с помощью ',', но это взорвало бы все запятые, содержащиеся в строках, массивах и т. Д. Так что мне нужно регулярное выражение, чтобы сделать это, я в порядке с регулярными выражениями, но, похоже, будет много правил в этом.

Ответы [ 5 ]

2 голосов
/ 30 мая 2011

Полагаю, если вы действительно хотите начать со строки (вместо массива, как предлагали другие), вы можете сделать следующее:

В 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 .

1 голос
/ 30 мая 2011

Звучит так, как вы хотите call_user_func_array вместо.

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

echo call_user_func_array($funcname, $params);
1 голос
/ 30 мая 2011

$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);
1 голос
/ 30 мая 2011

Может быть, вы могли бы просто использовать func_get_args для этого?

Кроме того, call_user_func, я считаю, должен вызываться так:

    call_user_func('functionName', $param1, $param2);
0 голосов
/ 30 мая 2011

Попробуйте, возможно, использовать call_user_func_array.

...