如何将可变数量的参数传递给sprintf()函数?
在我的网页,如果用户在表单中的动产某些选项,说如何将可变数量的参数传递给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));
我该如何做到这一点?
你想要的可能是vsprintf
函数。它将一个数组作为参数集。所以在你的情况下,你会有这样的事情:
$args = <array_of_chosen_options>;
$fmt = trim(str_repeat("%s ", count($args)));
$result = vsprintf($fmt, $args);
为什么要麻烦?为什么不只是'implode('',
@DaveRandom当然,在这个问题的简单场景中,'implode'会是一个更好的解决方案,但是在更复杂的情况下,每个选定元素的格式可能不同。 'vsprintf'更加灵活。 – 2012-03-29 11:26:54
谢谢,漂亮和优雅的解决方案! – Shubham 2012-03-29 11:28:34
- 生成的动态
%s %s...
- 使用
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);
为什么要麻烦?为什么不只是'implode('',
@DaveRandom:对我而言,sprintf()更清晰。这是一个SQL查询占位符,我有。 (“插入ABC('%s','%s'...)”)。 – Shubham 2012-03-29 11:35:57
sprintf()
是不是真的做到这一点的方式。它适用于带有动态占位符的静态字符串,而不是占位符数量未知的动态字符串。
无论您如何收集它们,您所选的所有选项都可能以数组形式出现。所以你可以只implode()
,就像这样:
$arr = array(
'Chosen option',
'Another option'
// ...
);
$str = implode(' ', $arr);
是的,你可以vsprintf()
,但为什么与生产必须进行解析和插值格式字符串的额外开销麻烦呢?
sprintf
不会是理想的方法。假设你的HTML看起来像
<input type="checkbox" name="options[]" value="A" /> A
<input type="checkbox" name="options[]" value="B" /> B
...
你可以做
$s = implode(" ", $_POST['options']);
我想知道你的意思,而不是复选框选项? – 2012-03-29 11:30:31