Преобразовать список аргументов функции в массив

#php #regex #preg-split

#php #регулярное выражение #предварительный раздел

Вопрос:

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

Я не знаю, какое регулярное выражение здесь использовать….
Я мог бы просто разнести по ‘,’ но это разнесло бы все запятые, содержащиеся в строках, массивах и т.д… Итак, для этого мне нужно регулярное выражение, я согласен с регулярными выражениями, но, похоже, в этом было бы много правил.

Комментарии:

1. Хорошо, я знаю о call_user_func_array, этот пример очень упрощен. Имя функции и все параметры являются динамическими и изначально не вводятся как массив. Вот почему я должен разделить их на массив. Я не знаю, почему call_user_func не будет работать у меня с несколькими аргументами?

Ответ №1:

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

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

Если вы хотите использовать более сложные типы (например: массивы или объекты), это будет настоящей проблемой. Вероятно, вам придется использовать токенизатор.

Комментарии:

1. Спасибо! Пока это работает, я даже не знал о функциях токенизатора… Мне нужно будет изучить это дальше. для параметров типа: testfunction(‘это param1’, array(‘one’ => ‘something’, ‘two’ => ‘что-то еще’), ‘и еще больше’, $someclass-> somefunction(‘дополнительные параметры’));

Ответ №2:

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

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

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

Ответ №3:

$params является ли (в вашем случае) единственной переменной, которая содержит единственное значение типа string . Это не массив или какой-либо другой сложный тип. Я предполагаю, что вам даже не нужен ваш %Complex Regex% .

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

foreach ($params as amp;$param) $param = trim($param, "' nrt");

echo call_user_func_array($funcname, $params);
  

Комментарии:

1. Да, однако это всего лишь очень простой пример. В какой-то момент я могу определить массивы. Так что это создает проблему… Все еще не уверен, как поступить в этом случае.

2. Если у вас уже есть массив, вы можете просто опустить explode() вещь, потому что это просто разбивает строку на массив. Интересная вещь call_user_func_array() .

Ответ №4:

Звучит так, будто вместо этого вы хотите вызвать_user_func_array.

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

echo call_user_func_array($funcname, $params);
  

Ответ №5:

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