vprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vprintfВыводит отформатированную строку

Описание

function vprintf(string $format, array $values): int

Выводит значения массива, отформатированные в соответствии с аргументом format, описанном в документации функции sprintf().

Работает как printf(), но принимает не переменное число аргументов, а массив.

Список параметров

format
Строка формата состоит из нуля или большего количества директив: стандартных символов, кроме %, которые выводятся без изменений, и спецификаторов преобразования, каждому из которых требуется параметр. Спецификация преобразования соответствует прототипу: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым идёт знак доллара $. Число указывает порядковый номер аргумента, который требуется преобразовать.

Флаги

Флаг Описание
- Выравнивает значение по левому краю в пределах заданной ширины поля; по умолчанию значение выравнивается по правому краю.
+ Выводит знак + перед неотрицательными числами; по умолчанию только к отрицательным числам добавляется знак минус.
(пробел) Дополняет результат пробелами, которыми также при заданной ширине значение дополняется по умолчанию.
0 Дополняет числа нулями, но только слева. Со спецификатором s и флагом левостороннего выравнивания значение дополняется нулями справа.
'символ Дополняет результат символом, который указали после апострофа.

Ширина

Ширина задаётся либо целым числом — минимум символов, который выводится в результате преобразования, либо символом *. При передаче символа * ширина задаётся в списке аргументов дополнительным целым числом перед значением, которое относится к спецификатору.

Точность

Символ ., за которым необязательно идёт целое число или символ *. Значение точности зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой. Значение по умолчанию — 6.
  • Для спецификаторов g,G, h и H: задаёт предельное количество значащих цифр для вывода.
  • Для спецификатора s: устанавливает точку отсечения для ограничения количества символов в строке.

Замечание: При пропуске явного значения точности после точки за точность принимается значение 0. Точность задаётся дополнительным целочисленным аргументом перед значением, к которому относится спецификатор, если вместо значения точности в строке формата указали символ *.

Спецификаторы
Спецификатор Описание
% Символ процента. Аргументы не требуются.
b Аргумент рассматривается как целое число и печатается в бинарном представлении.
c Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d Аргумент рассматривается как целое число и печатается как целое число со знаком.
e Аргумент считается за число в научной нотации (т. е. 1.2e+2).
E Аргумент аналогичен спецификатору e, но с заглавным символом (т. е. 1.2E+2).
f Аргумент считается за число с плавающей точкой (с учётом локали).
F Аргумент считается за число с плавающей точкой (без учёта локали).
g Общий формат. Пусть P равно точности, если точность не равна нулю, 6, если точность не задали, или 1, если точность равна 0. Тогда, если преобразование со стилем «E» будет иметь показатель степени X: Если P > X ≥ −4, преобразование будет в стиле «f» и точность будет P - (X + 1). Иначе преобразование будет в стиле «e» и точность будет P - 1.
G Аргумент аналогичен спецификатору g, но использует спецификаторы E и f.
h Аргумент аналогичен спецификатору g, но использует спецификатор F. Доступен с PHP 8.0.0.
H Аргумент аналогичен спецификатору g, но использует спецификаторы E и F. Доступен с PHP 8.0.0.
o Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s Аргумент рассматривается и печатается как строка.
u Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует спецификаторы преобразования дополнения и ширины.

Внимание

Попытка использовать комбинацию спецификаторов строки и ширины с кодировками, которые требуют больше одного байта на символ, иногда даёт неожиданные результаты.

Функция приведёт переменные к типу, который соответствует спецификатору:

Обработка типов
Тип Спецификатор
string s
int d, u, c, o, x, X, b
float e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает длину выведенной строки.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия Описание
8.0.0 Функция больше не возвращает false, если возникла ошибка.
8.0.0 Выбрасывает исключение ValueError, если количество аргументов равно нулю; раньше функция выдавала ошибку уровня E_WARNING.
8.0.0 Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; раньше функция выдавала ошибку уровня E_WARNING.
8.0.0 Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; раньше функция выдавала ошибку уровня E_WARNING.
8.0.0 Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; раньше функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 vprintf(): дополнение нулями целых чисел

<?php
vprintf
("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>

Результат выполнения приведённого примера:

1988-08-01

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку по условиям формата
  • fscanf() - Обрабатывает данные из файла по условиям формата
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует метку времени эпохи Unix

Добавить

Примечания пользователей 8 notes

up
11
steve at stevelockwood dot net
11 years ago
If, instead of an array, you pass an object PHP will automatically cast the object as an array so you can use it directly in vprintf.
<?php
 $object = new stdClass();
 $object->Property1 = 'Value 1';
 $object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);

/* will output
 Value 1              Value 2             
*/
?>
up
1
phpcoder at gmail dot com
6 years ago
Using the ... operator, vprintf($format, $array) is basically just printf($format, ...$array).
up
0
tehjosh at gamingg dot net
18 years ago
To toolofthesystem at gmail dot com:

You don't need to use output buffering with vprintf() because you can use vsprintf(), which has the same functionality as vprintf(), except that it returns the resulting string instead of outputting it.
up
-1
taken from &#34;Php Phrasebook&#34;
17 years ago
<?php
$string = 'The site runs on PHP '.phpversion();
preg_match('/php ((\d)\.\d\.\d+)/i',$string,$matches);
print_r($matches);
vprintf('Match: %s<br /> Version %s; Major:%d.',$matches);
?>

output:
Array ( [0] => PHP 5.2.5 [1] => 5.2.5 [2] => 5 ) 
Match: PHP 5.2.5 Version 5.2.5; Major:5.

For preg_match:

If matches  is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1]  will have the text that matched the first captured parenthesized subpattern, and so on.
up
-2
Chris
13 years ago
Another way to display arrays is use an array_walk(). This can be useful inline echo/print where a foreach wouldn't work, e.g.

<?php
echo "These errors: ", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "must be corrected.";
?>
up
-2
toolofthesystem at gmail dot com
19 years ago
This function comes useful sometimes when trying to list information returned from MySQL:

function print_sql($query,$printf){
    $sql_sql = mysql_query($query);
    while($sql = mysql_fetch_row($sql_sql)){
        vprintf($printf,$sql);
    }
}

Unfortunately, this seems to sneak its way past output buffering when I tried creating an argument to allow it to be contained in a returned string... either that or I didn't do it right.
up
-2
caleb at tekhawk dot com
19 years ago
i know that you can use %1$s or %3$s to select the first or third string but how can you or can you use array names to select it

something like %'user'$s $'email'$s

i tend to add things to my databases over time and this could save loads of recoding
up
-5
badcop666 at hotmail dot com
18 years ago
For blocks of text, sprintf() is slow according to my tests. 

Also, having the mapping between place-holders and the list of actual variables or datastructures often makes this code difficult to read. But the printf() family are widely supported and have a huge range of nice features. Performance is a cold mistress though!

From an ease-of-reading and maintenance, debugging point of view, I much prefer HEREDOC and "...{$variable}..." methods.

For a block of HTML markup with place holders, the fastest by far was:-

?>
<div> markup etc<?= $variable ?>more markup
<?

My tests comprised 20 runs of a loop of 1 million iterations with output buffering, ditching the buffer on each loop.

The timings ranged from average 2.1msec/million repetitions for the <?= $var ?> method up to 7.6msec/million using printf().

I'll try some benchmarking tools too, since I just wrote this myself and it could be introducing bias, but they've run on dev servers with low load.

Hopefully interesting.
To Top