Vprintf: примеры (PHP)
vprintf(string format, array values): intФункция vprintf в PHP используется для вывода отформатированных строк. В отличие от функции printf, принимает массив аргументов вместо переменного количества параметров. Эта особенность полезна при динамическом формировании данных.
Функция применяется в ситуациях, когда количество подставляемых значений неизвестно заранее или они хранятся в массиве. Типичные сценарии включают генерацию отчетов, логов, пользовательских сообщений и шаблонов.
vprintf(string $format, array $values): int
- $format — строка форматирования, содержащая спецификаторы преобразования
- $values — массив значений для подстановки в шаблон
- Возвращаемое значение — длина выведенной строки
Функция поддерживает стандартные спецификаторы: %s (строка), %d (целое число), %f (число с плавающей точкой), %b (двоичное), %x (шестнадцатеричное). Также доступны флаги: заполнение нулями, выравнивание, точность.
$data = ['Иван', 1500, 45.67];
vprintf('Имя: %s, Баллы: %d, Рейтинг: %.2f', $data);
Имя: Иван, Баллы: 1500, Рейтинг: 45.67
$values = [15, 3.14159];
vprintf('Число: %04d, Пи: %0.3f', $values);
Число: 0015, Пи: 3.142
$args = ['января', 2024];
vprintf('Дата: 15 %1$s %2$d года', $args);
Дата: 15 января 2024 года
Аналогична vprintf, но принимает аргументы напрямую, а не в массиве. Удобна при фиксированном количестве параметров.
Возвращают отформатированную строку вместо её вывода. vsprintf принимает массив аргументов. Используются для сохранения результата в переменную.
Записывают результат в файловый ресурс. vfprintf принимает массив значений. Применяются для логирования в файлы.
vprintf оптимальна при выводе массивов данных. Для возврата строки используют vsprintf. При работе с файлами выбирают vfprintf. Простой printf подходит для статических аргументов.
$data = ['Текст'];
vprintf('Результат: %s и %s', $data);
Warning: vprintf(): Too few arguments
$values = ['строка'];
vprintf('Число: %d', $values);
Число: 0
$args = ['А', 'Б'];
vprintf('%2$s %3$s', $args);
Warning: vprintf(): Argument number must be greater than zero
setlocale(LC_ALL, 'ru_RU.UTF-8');
$values = [1500.5];
vprintf('Сумма: %f', $values); // Локали может изменить десятичный разделительВ PHP 8.0 была улучшена обработка несоответствий в форматировании. Некритические предупреждения стали более информативными.
В версиях PHP 7.1-7.4 оптимизирована работа с форматированием строк, включая функции семейства printf.
Ранние версии PHP могли некорректно обрабатывать некоторые комбинации флагов. Современные реализации более предсказуемы.
$headers = ['Имя', 'Возраст', 'Город'];
$rows = [
['Анна', 28, 'Москва'],
['Петр', 35, 'Сочи'],
['Мария', 31, 'Казань']
];
$format = '| %-15s | %-8s | %-15s |' . PHP_EOL;
vprintf($format, $headers);
echo str_repeat('-', 50) . PHP_EOL;
foreach ($rows as $row) {
vprintf($format, $row);
}
| Имя | Возраст | Город | -------------------------------------------------- | Анна | 28 | Москва | | Петр | 35 | Сочи | | Мария | 31 | Казань |
$conditions = [
'status' => 'active',
'date_from' => '2024-01-01',
'limit' => 100
];
$sqlParts = [];
foreach ($conditions as $key => $value) {
if (is_string($value)) {
$sqlParts[] = sprintf('%s = "%s"', $key, $value);
} else {
$sqlParts[] = sprintf('%s = %d', $key, $value);
}
}
$query = 'SELECT * FROM users WHERE '
. implode(' AND ', $sqlParts)
. ' ORDER BY id';
echo $query;
SELECT * FROM users WHERE status = "active" AND date_from = "2024-01-01" AND limit = 100 ORDER BY id
setlocale(LC_MONETARY, 'ru_RU.UTF-8');
$amounts = [1234.56, 789.01, 45678.90];
foreach ($amounts as $amount) {
vprintf('Сумма: %' . money_format('%.2n', $amount) . '%s', ['', PHP_EOL]);
}
Сумма: 1 234,56 руб. Сумма: 789,01 руб. Сумма: 45 678,90 руб.
$templates = [
'en' => 'Welcome, %s! Your balance: $%.2f',
'ru' => 'Добро пожаловать, %s! Ваш баланс: %.2f руб.'
];
$userData = ['Алексей', 1250.75];
$lang = 'ru';
vprintf($templates[$lang], $userData);
Добро пожаловать, Алексей! Ваш баланс: 1250.75 руб.
$measurements = [
['voltage' => 3.1415926535, 'current' => 0.001234],
['voltage' => 1.6180339887, 'current' => 0.000987]
];
foreach ($measurements as $m) {
vprintf('Напряжение: %E В, Ток: %e А' . PHP_EOL,
[$m['voltage'], $m['current']]);
}
Напряжение: 3.141593E+0 В, Ток: 1.234000e-3 А Напряжение: 1.618034E+0 В, Ток: 9.870000e-4 А
values = ['Иван', 1500]
print('Имя: {}, Баллы: {}'.format(*values))
# или
name, score = 'Иван', 1500
print(f'Имя: {name}, Баллы: {score}')
Имя: Иван, Баллы: 1500
const name = 'Иван';
const score = 1500;
console.log(`Имя: ${name}, Баллы: ${score}`);
Имя: Иван, Баллы: 1500
SELECT CONCAT('Сумма: ', FORMAT(12345.678, 2));
Сумма: 12,345.68
В C нет прямой аналогии, но можно передавать массив через va_list в пользовательских функциях.