2012-03-29 147 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']); 
相關問題