2012-03-29 10 views
2

In meiner Web-Seite, wenn ein Benutzer bestimmte Optionen in einer Form choses, sagenWie kann ich eine variable Anzahl von Argumenten an die Funktion sprintf() übergeben?

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

Dann sprintf() Funktion in meinem Skript, dass die Anzahl von Argumenten annehmen sollte -

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

Wenn alle drei sind gewählt, dann

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

Wie kann ich das erreichen?

+0

Ich frage mich, ob Sie Kontrollkästchen statt Optionen gemeint? –

Antwort

4

Was Sie wollen, ist wahrscheinlich die vsprintf Funktion. Es nimmt ein Array als die Menge der Argumente. Also in Ihrem Fall würden Sie so etwas wie dieses:

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

Warum stören? Warum nicht einfach implode ('', ) '? – DaveRandom

+0

@DaveRandom Natürlich wäre 'implode' im einfachen Szenario in der Frage eine bessere Lösung, aber in einem komplexeren Fall kann die Formatierung für jedes ausgewählte Element anders sein. 'Vsprintf' ist viel flexibler. –

+0

Danke, schöne und elegante Lösung! – Shubham

2
  1. die Zeichenfolge von %s %s...
  2. Verwendung dynamisch generieren vsprintf statt 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

Warum stören? Warum nicht einfach implode ('', ) '? – DaveRandom

+0

@DaveRandom: Nun, für meinen Fall ist sprintf() sauberer. Wirklich, es ist ein SQL-Abfrage-Platzhalter, den ich habe. ("INSERT in ABC ('% s', '% s' ...)"). – Shubham

0

sprintf() ist nicht wirklich die Art und Weise, dies zu tun. Es ist für statische Strings mit dynamischen Platzhaltern vorgesehen, nicht für dynamische Strings mit einer unbekannten Anzahl von Platzhaltern.

Alle Ihre gewählten Optionen, egal wie Sie sie gesammelt haben, werden wahrscheinlich in einem Array enden. So konnte man nur implode() es, wie folgt aus:

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

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

Ja, man konnte vsprintf() es, aber warum mit dem zusätzlichen Aufwand die Mühe einen Format-String zu erzeugen, die analysiert und interpoliert werden müssen?

0

sprintf wäre nicht der ideale Ansatz. Unter der Annahme, dass Ihr HTML wie

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

sieht können Sie tun nur

$s = implode(" ", $_POST['options']); 
Verwandte Themen