所以假设我有一个功能:
function j($a, $b){
return $a + $b;
}
然后我将函数的预期参数放入一个字符串中:
$str = '1,3';
有没有办法让函数将单个字符串参数视为程序员插入函数的参数....所以当你这样做时
j($str)
,
而不是让函数将$ str视为单个字符串参数,它取出字符串的内容并将其视为程序员编写j(1,3)
而不是j($str)
这也是一个相当简单的例子,但我希望它适用于更复杂的参数字符串,包括数组,多维数组,关联数组,数组中的数组,以及包含逗号的字符串参数(所以只是用逗号爆炸是不可行的)
我也不想在解决方案中使用eval()
此外,我试图让这个功能不仅仅是我的(而不仅仅是这个特定功能,这只是一个毫无价值的示例函数),所以最好是在函数之外进行操作
答案 0 :(得分:1)
这应该适用于单个逗号分隔的字符串:
function j($str){
list($a, $b) = explode(',', $str);
return $a + $b;
}
您希望在多维数组中求和?所有的值?
如果是:您只需要检查参数的类型(例如使用is_array())然后迭代它。当它是多维的时,递归调用你的函数。
答案 1 :(得分:1)
创建所有参数,但第一个参数除了可选,如果第一个参数是字符串(或包含,
),则使用list()
和explode()
:
function j($a, $b=null){
if(strpos($a,',')!==false){
list($a,$b) = explode(',',$a)
}
return $a + $b;
}
这只是一个基本的例子,但原则应该是明确的:
答案 2 :(得分:1)
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);
答案 3 :(得分:0)
call_user_func_array('j', explode(',', $str));
http://www.php.net/call_user_func_array
我不知道你想如何使“更复杂的参数字符串包括数组数组”,因为很难将它们表示为字符串。如果你可以将你拥有的任何字符串格式化为数组,例如使用JSON字符串和json_decode
,call_user_func_array
就是你的朋友。
答案 4 :(得分:0)
这有效:)
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)");
答案 5 :(得分:0)
大多数答案都假定,所有内容都用逗号“,”很好地分隔开了,但并非总是如此。例如,可能有不同的变量类型,甚至是带有逗号的字符串。
$values = "123, 'here, is, a, problem, that, can\'t, be, solved, with, explode() function, mkay?'";
这可以通过eval()和php 7中点的“ ...” args检索来处理。
function helper_string_args(...$args) {
return $args;
}
$func = "\$values = \\helper_string_args($values);";
try {
eval($func);
} catch (Exception $e) {
var_dump($e);
exit;
}