преобразовать строку в аргументы php - PullRequest
1 голос
/ 24 октября 2011

Итак, предположим, у меня есть функция:

function j($a, $b){
 return $a + $b;
}

, а затем я помещаю предполагаемые аргументы функции в строку:

$str = '1,3';

есть ли способ сделать функциюобрабатывать однострочный аргумент так, как если бы это были аргументы, которые программист вставил в функцию .... поэтому, когда вы делаете

j($str),

вместо того, чтобы функция обрабатывала $str как единственный строковый аргумент, он выбирает содержимое строки и обрабатывает его так, как если бы программист написал j(1,3) вместо j($str)

, также это довольно простой пример, но я бы хотелработать с еще более сложными аргументными строками, включающими массивы, многомерные массивы, ассоциативные массивы, массив внутри массивов, а также строковые аргументы, содержащие запятые (так что просто взорвать через запятую не реально)

также яЯ бы не хотел использовать eval () в решении

EDIT

Также я пытаюсь заставить это работать на любой функции, не только моей (и не только этой спецификации).классическая функция (которая является просто бесполезной примерной функцией), поэтому желательно, чтобы операция выполнялась вне функции

Ответы [ 6 ]

1 голос
/ 24 октября 2011
function j($a, $b = 0){ // make second arg optional
  if (! $b) { // is second arg specified and not zero
    if (strpos($a, ',') !== false){ // has provided first arg a comma
       list($first, $second) = explode(',' $a); // yes then get two values from it
       return $first + $second; // return the result
    }
  }
  else {
     return $a + $b; // two args were passed, return the result
  }

}

Теперь ваша функция будет поддерживать оба формата с одним аргументом, например:

$str = '1,3'
j($str);

а также два аргумента:

j(5, 10);
1 голос
/ 24 октября 2011

делает все параметры, кроме первого, необязательными, а затем использует list() и explode(), если первый параметр является строкой (или содержит ,):

function j($a, $b=null){
  if(strpos($a,',')!==false){
    list($a,$b) = explode(',',$a)
  }
  return $a + $b;
}

это просто базовый пример, но принцип должен быть ясен:

  • проверка, состоит ли один из аргументов из нескольких параметров
  • если это так, проанализируйте его самостоятельно, чтобы получить единственные параметры
1 голос
/ 24 октября 2011

Это должно работать для одной строки, разделенной запятыми:

function j($str){
 list($a, $b) = explode(',', $str);
 return $a + $b;
}

Что вы хотите суммировать в многомерном массиве?Все значения?

Если да: вам нужно только проверить тип вашего аргумента (например, используя is_array ()), а затем выполнить его итерацию.Когда он многомерен, рекурсивно вызывайте вашу функцию.

0 голосов
/ 14 февраля 2019

Большинство ответов предполагают, что все хорошо разделено комой ",", но это не всегда так.Например, могут быть разные типы переменных, даже строки с запятой.

$values = "123, 'here, is, a, problem, that, can\'t, be, solved, with, explode() function, mkay?'";

Это может быть обработано с помощью eval () и поиска точек "..." в php 7.

function helper_string_args(...$args) {
    return $args;
}

$func = "\$values = \\helper_string_args($values);";
try {
    eval($func);
} catch (Exception $e) {
    var_dump($e);
    exit;
}
0 голосов
/ 24 октября 2011

Это работает:)

function f($str, $delimiter = ';')
{
    $strargs = explode($delimiter, $str);
    $args = array();
    foreach($strargs as $item)
        eval("\$args[] = " . $item. ";");
    // $args contains all arguments
    print_r($args);
}

Проверьте это:

f("6;array(8,9);array(array(1,0,8), 5678)");
0 голосов
/ 24 октября 2011
call_user_func_array('j', explode(',', $str));

http://www.php.net/call_user_func_array

Я понятия не имею, как вы хотите сделать эту работу для "более сложных строк аргументов, включая массивы массивов", поскольку их трудно выразить как строки.Если вы можете отформатировать любую строку в массиве, например, используя строки JSON и json_decode, call_user_func_array - ваш друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...