2012-03-29 258 views
2

在我的网页,如果用户在表单中的动产某些选项,说如何将可变数量的参数传递给sprintf()函数?

1. A - Chosen 
2. B - Chosen 
3. C - Not Chosen 

然后,在我的脚本的sprintf()函数应该接受的观点认为数量 -

sprintf("%s %s", valueOf(A), valueOf(B)); 

如果所有三个选择,然后

sprintf("%s %s %s", valueOf(A), valueOf(B), valueOf(C)); 

我该如何做到这一点?

+0

我想知道你的意思,而不是复选框选项? – 2012-03-29 11:30:31

回答

4

你想要的可能是vsprintf函数。它将一个数组作为参数集。所以在你的情况下,你会有这样的事情:

$args = <array_of_chosen_options>; 
$fmt = trim(str_repeat("%s ", count($args))); 
$result = vsprintf($fmt, $args); 
+0

为什么要麻烦?为什么不只是'implode('',)'? – DaveRandom 2012-03-29 11:25:52

+0

@DaveRandom当然,在这个问题的简单场景中,'implode'会是一个更好的解决方案,但是在更复杂的情况下,每个选定元素的格式可能不同。 'vsprintf'更加灵活。 – 2012-03-29 11:26:54

+0

谢谢,漂亮和优雅的解决方案! – Shubham 2012-03-29 11:28:34

2
  1. 生成的动态%s %s...
  2. 使用vsprintf的字符串,而不是sprintf
# // FOR DEMONSTRATION \\ 
$_POST["A"] = "subscribe_to_this"; 
$_POST["B"] = "subscribe_to_that"; 
# \\ FOR DEMONSTRATION // 

$chosen = array(); 
if (isset($_POST["A"])) $chosen[] = $_POST["A"]; 
if (isset($_POST["B"])) $chosen[] = $_POST["B"]; 
if (isset($_POST["C"])) $chosen[] = $_POST["C"]; 

$format = implode(" ", array_fill(0, count($chosen), "%s")); 
echo vsprintf($format, $chosen); 
+0

为什么要麻烦?为什么不只是'implode('',)'? – DaveRandom 2012-03-29 11:26:17

+0

@DaveRandom:对我而言,sprintf()更清晰。这是一个SQL查询占位符,我有。 (“插入ABC('%s','%s'...)”)。 – Shubham 2012-03-29 11:35:57

0

sprintf()是不是真的做到这一点的方式。它适用于带有动态占位符的静态字符串,而不是占位符数量未知的动态字符串。

无论您如何收集它们,您所选的所有选项都可能以数组形式出现。所以你可以只implode(),就像这样:

$arr = array(
    'Chosen option', 
    'Another option' 
    // ... 
); 

$str = implode(' ', $arr); 

是的,你可以vsprintf(),但为什么与生产必须进行解析和插值格式字符串的额外开销麻烦呢?

0

sprintf不会是理想的方法。假设你的HTML看起来像

<input type="checkbox" name="options[]" value="A" /> A 
<input type="checkbox" name="options[]" value="B" /> B 
... 

你可以做

$s = implode(" ", $_POST['options']); 
相关问题