преобразование строки в аргументы php

#php #string #function #arguments

#php #строка #функция #аргументы

Вопрос:

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

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

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

 $str = '1,3';
 

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

j($str) ,

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

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

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

Редактировать

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

Ответ №1:

 call_user_func_array('j', explode(',', $str));
 

http://www.php.net/call_user_func_array

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

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

1. например, строка ‘array(array (1))’ должна оцениваться как одна переменная, представляющая собой массив, содержащий другой массив, содержащий 1

2. Чтобы сделать это без eval вас, вам понадобится какая-то пользовательская функция синтаксического анализа строк. Вы могли бы легко пойти на json_decode('[[1]]', true) это. В общем, буквальный PHP не совсем лучший выбор для выражения сложных структур данных в виде строк. Для этого используйте форматы, которые были созданы для этого, такие как JSON или сериализованный PHP.

Ответ №2:

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

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

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

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

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

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

2. @kamikaze_pilot Это нужно делать в каждом конкретном случае, если вы приведете нам реальный пример того, чего вы пытаетесь достичь, мы можем помочь, но для любой конкретной ситуации ответ, вероятно, будет полностью отличаться от другого…

Ответ №3:

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

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

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

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

Ответ №4:

 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);
 

Ответ №5:

Это работает 🙂

 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)");
 

Ответ №6:

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

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

Это можно обработать с помощью eval() и поиска аргументов dot «…» в 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;
}