如何向sprintf()函数传递可变数量的参数?

6
在我的网页中,如果用户在表单中选择了某些选项,比如说:
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));

我该如何实现这个目标?

我在想你是否指的是复选框而不是选项? - Salman A
4个回答

13

你可能需要使用vsprintf函数。该函数以数组形式接受参数。因此,在你的情况下,代码应该类似于:

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

1
为什么要麻烦呢?为什么不直接使用 implode(' ', <array_of_chosen_options>) 呢? - DaveRandom
@DaveRandom 当然,在问题中简单的情况下,implode 是更好的解决方案,但是在更复杂的情况下,所选元素的格式可能不同。vsprintf 更加灵活。 - Aleks G
谢谢,这是一个漂亮而优雅的解决方案! - Shubham

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

为什么要麻烦呢?为什么不直接使用 implode(' ', <array_of_chosen_options>) 呢? - DaveRandom
@DaveRandom:对于我的情况,sprintf() 更加简洁。实际上,我有一个 SQL 查询占位符("INSERT into ABC ('%s','%s'...)")。 - Shubham

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接