Php 如何将可变数量的参数传递给sprintf()函数?

Php 如何将可变数量的参数传递给sprintf()函数?,php,string,printf,Php,String,Printf,在我的网页中,如果用户选择表单中的某些选项,比如 1。被选中的人 2.B-选择 3.C-未选择 然后,脚本中的sprintf()函数应该接受该数量的参数- sprintf("%s %s", valueOf(A), valueOf(B)); 如果三者都被选中,那么 sprintf("%s %s %s", valueOf(A), valueOf(B), valueOf(C)); 我怎样才能做到这一点 动态生成%s%s..的字符串。 使用而不是sprintf #//用于演示\\ $\u POST

在我的网页中,如果用户选择表单中的某些选项,比如

1。被选中的人
2.B-选择
3.C-未选择
然后,脚本中的sprintf()函数应该接受该数量的参数-

sprintf("%s %s", valueOf(A), valueOf(B));
如果三者都被选中,那么

sprintf("%s %s %s", valueOf(A), valueOf(B), valueOf(C));
我怎样才能做到这一点

  • 动态生成
    %s%s..的字符串。
  • 使用而不是
    sprintf
  • #//用于演示\\
    $\u POST[“A”]=“订阅此”;
    $\u POST[“B”]=“订阅”;
    #\\用于演示//
    $selected=array();
    如果(isset($_POST[“A”]))$选择的[]=$_POST[“A”];
    如果(isset($_POST[“B”]))$selected[]=$_POST[“B”];
    如果(isset($_POST[“C”]))$selected[]=$_POST[“C”];
    $format=内爆(“,数组填充(0,计数($selected),“%s”);
    echo vsprintf($format,$selected);
    
    sprintf()
    并不是真正做到这一点的方法。它适用于具有动态占位符的静态字符串,而不是具有未知占位符数目的动态字符串

    您选择的所有选项,无论您如何收集它们,都可能以数组形式结束。所以你可以这样做:

    $arr = array(
      'Chosen option',
      'Another option'
      // ...
    );
    
    $str = implode(' ', $arr);
    
    $args = <array_of_chosen_options>;
    $fmt = trim(str_repeat("%s ", count($args)));
    $result = vsprintf($fmt, $args);
    

    是的,您可以
    vsprintf()
    it,但是为什么还要为生成必须解析和插值的格式字符串而烦恼呢?

    您想要的可能是函数。它采用数组作为参数集。所以在你的情况下,你会有这样的东西:

    $arr = array(
      'Chosen option',
      'Another option'
      // ...
    );
    
    $str = implode(' ', $arr);
    
    $args = <array_of_chosen_options>;
    $fmt = trim(str_repeat("%s ", count($args)));
    $result = vsprintf($fmt, $args);
    
    $args=;
    $fmt=trim(str_repeat(“%s”,count($args));
    $result=vsprintf($fmt,$args);
    
    sprintf
    不是理想的方法。假设您的HTML看起来像

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

    为什么要麻烦?为什么不仅仅是
    内爆(“”,
    ?@DaveRandom当然,在问题中的简单场景中,
    内爆
    将是更好的解决方案,但是在更复杂的情况下,每个选定元素的格式可能不同
    vsprintf
    更加灵活。谢谢,这是一个漂亮而优雅的解决方案!为什么要麻烦?为什么不干脆
    内爆(“”,
    ?@DaveRandom:嗯,就我而言,sprintf()更干净。实际上,它是我拥有的一个SQL查询占位符。(“插入ABC('%s','%s'…)”)。我想知道您是指复选框而不是选项吗?