#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;
}