Как передать переменное число аргументов в функцию sprintf ()? - PullRequest
4 голосов
/ 29 марта 2012

На моей веб-странице, если пользователь выбирает определенные параметры в форме, скажем

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

Как мне этого добиться?

Ответы [ 4 ]

7 голосов
/ 29 марта 2012

Вероятно, вам нужна функция vsprintf. Он принимает массив в качестве набора аргументов. Так что в вашем случае у вас будет что-то вроде этого:

$args = <array_of_chosen_options>;
$fmt = trim(str_repeat("%s ", count($args)));
$result = vsprintf($fmt, $args);
2 голосов
/ 29 марта 2012
  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 голосов
/ 29 марта 2012

sprintf не будет идеальным подходом. Предполагая, что ваш HTML выглядит как

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

Вы можете просто сделать

$s = implode(" ", $_POST['options']);
0 голосов
/ 29 марта 2012

sprintf() на самом деле не способ сделать это.Он предназначен для статических строк с динамическими заполнителями, а не динамических строк с неизвестным числом заполнителей.

Все выбранные вами параметры, независимо от того, как вы их собрали, вероятно, окажутся в массиве.Таким образом, вы можете просто implode() это, например:

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

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

Да, вы можете vsprintf() это, но зачем беспокоиться о дополнительных затратах на создание строки формата, котораябыть проанализирован и интерполирован?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...