Vsprintf: примеры (PHP)
vsprintf(string format, array values): stringФункция vsprintf является вариативной версией sprintf. Она форматирует строку, используя массив аргументов, а не переменное количество отдельных параметров.
Использование функции актуально в ситуациях, когда данные для подстановки в шаблон строки уже собраны в массив, либо когда количество аргументов определяется динамически.
vsprintf(string $format, array $values): string|false- $format (string) - Строка форматирования. Содержит обычные символы и спецификаторы преобразования, которые начинаются со знака процента (%).
- $values (array) - Массив значений для подстановки в спецификаторы формата $format. Количество элементов в массиве должно соответствовать количеству спецификаторов.
- Возвращаемое значение: Отформатированная строка в случае успеха или false в случае возникновения ошибки.
Основные спецификаторы: %b (двоичное число), %d (целое число со знаком), %f (число с плавающей точкой), %s (строка). Спецификаторы могут содержать флаги, ширину, точность и другие модификаторы: %2$s (позиционный аргумент), %'*-10s (заполнение и выравнивание).
$format = 'Привет, %s! Тебе %d лет.';
$data = ['Анна', 25];
echo vsprintf($format, $data);Привет, Анна! Тебе 25 лет.
$format = 'Имя: %2$s, Фамилия: %1$s';
$data = ['Иванова', 'Мария'];
echo vsprintf($format, $data);Имя: Мария, Фамилия: Иванова
$format = 'Число: %05d, Цена: $%.2f';
$data = [42, 19.999];
echo vsprintf($format, $data);Число: 00042, Цена: $20.00
$format = "[%-10s] [%'#10s]\n";
$data = ['Текст', 'Заполнение'];
echo vsprintf($format, $data);[Текст ] [####Заполнение]
- sprintf: Аналогична vsprintf, но принимает аргументы через запятую, а не массив. Удобна при статическом, известном на этапе написания кода количестве параметров.
- vfprintf: Записывает отформатированную строку в поток, например, в файл или стандартный вывод. Принимает первым аргументом ресурс потока.
- printf: Немедленно выводит отформатированную строку, аналогично echo sprintf(...).
- Str\format (из Symfony\Polyfill): Более современный и часто более читаемый способ форматирования строк, доступный при установке соответствующего пакета. Использует синтаксис с фигурными скобками: Str::format('Привет, {}!', $name).
Функцию vsprintf предпочтительнее использовать, когда аргументы для форматирования уже находятся в массиве или генерируются динамически. sprintf лучше подходит для простых случаев с фиксированным набором аргументов.
$format = '%s %s %s';
$data = ['Первый', 'Второй'];
$result = vsprintf($format, $data);
echo $result;Warning: vsprintf(): Too few arguments
$format = 'Число: %d';
$data = ['не_число'];
$result = vsprintf($format, $data);
echo $result; // Поведение зависит от версии PHP и настроекЧисло: 0
$format = 'Скидка 50% для %s';
$data = ['клиентов'];
$result = vsprintf($format, $data); // Интерпретирует 50% как спецификатор
echo $result;Warning: vsprintf(): Too few arguments (или некорректный вывод)
Для исправления последней ошибки требуется экранирование: 'Скидка 50%% для %s'.
- PHP 8.0: Функция теперь выбрасывает исключение ValueError, если количество аргументов в массиве недостаточно для заполнения всех спецификаторов в строке формата. Ранее в этой ситуации генерировалась ошибка уровня E_WARNING, а функция возвращала false.
- PHP 8.2: Возвращаемый тип функции явно объявлен как string|false в документации и сигнатурах. Изменений в поведении нет, но улучшена типобезопасность.
// Поведение в PHP 8.0+ при недостатке аргументов
try {
$result = vsprintf('%s %s', ['один']);
} catch (\ValueError $e) {
echo 'Ошибка: ' . $e->getMessage();
}Ошибка: The arguments array must contain 2 items, 1 given
$conditions = ['active = 1', "city = 'Москва'"];
$format = 'SELECT * FROM users WHERE %s';
$whereClause = implode(' AND ', $conditions);
// ВНИМАНИЕ: Использовать только для безопасных, проверенных данных.
// Для реальных запросов всегда использовать подготовленные выражения.
$query = vsprintf($format, [$whereClause]);
echo $query;SELECT * FROM users WHERE active = 1 AND city = 'Москва'
$format = 'Пункт %d: %s; ';
$items = [1 => 'Первое', 2 => 'Второе', 3 => 'Третье'];
$data = [];
foreach ($items as $num => $text) {
$data[] = $num;
$data[] = $text;
}
// Использование str_repeat для формата и массива данных
$result = vsprintf(str_repeat($format, count($items)), $data);
echo rtrim($result, '; ');Пункт 1: Первое; Пункт 2: Второе; Пункт 3: Третье
$format = "\n"
. " %04d\n"
. " %s
\n"
. " Цена: %'.8f руб.
\n"
. " Статус: %s
\n"
. "\n";
$products = [
[45, 'Монитор', 15999.99, 'active', 'В наличии'],
[128, 'Клавиатура', 2450.5, 'inactive', 'Нет на складе'],
];
foreach ($products as $product) {
echo vsprintf($format, $product);
}0045Монитор
Цена: 15,999.99000000 руб.
Статус: В наличии
0128Клавиатура
Цена: 2,450.50000000 руб.
Статус: Нет на складе
setlocale(LC_MONETARY, 'ru_RU.UTF-8');
$format = 'Итог: %s (без форматирования: %.2f)';
$amount = 1234567.89;
$formattedMoney = money_format('%!i', $amount); // Альтернативная функция
// vsprintf комбинирует результат другой функции форматирования
$result = vsprintf($format, [$formattedMoney, $amount]);
echo $result;Итог: 1 234 567,89 руб. (без форматирования: 1234567.89)
# Аналог с позиционными аргументами
values = ['Иванова', 'Мария']
result = 'Имя: {1}, Фамилия: {0}'.format(*values)
print(result)
# Современная альтернатива - f-строка (Python 3.6+)
first, last = values
result = f'Имя: {last}, Фамилия: {first}'
print(result)Имя: Мария, Фамилия: Иванова Имя: Мария, Фамилия: Иванова
// Ближайший аналог - использование оператора spread
function vsprintfJS(format, values) {
return sprintfJS(format, ...values); // sprintfJS - внешняя библиотека
}
// Нативная современная альтернатива
const name = 'Анна';
const age = 25;
const result = `Привет, ${name}! Тебе ${age} лет.`;
console.log(result);Привет, Анна! Тебе 25 лет.
-- Форматирование чисел, аналог для чисел с плавающей точкой
SELECT FORMAT(12345.6789, 2) AS formatted_number;
-- Полного аналога форматирования строки нет, используется CONCAT
SELECT CONCAT('Имя: ', 'Мария', ', Возраст: ', 25) AS result;formatted_number: 12,345.68 result: Имя: Мария, Возраст: 25
Главное отличие PHP-функции vsprintf от аналогов - строгая типизация спецификаторов формата и наличие позиционных аргументов, что предоставляет детальный контроль над итоговой строкой.