(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
vprintf — Выводит отформатированную строку
Выводит значения массива, отформатированные в соответствии с
аргументом format, описанном в документации функции
sprintf() .
Работает как printf() , но принимает не переменное число аргументов, а массив.
format%,
которые выводятся без изменений, и спецификаторов преобразования,
каждому из которых требуется параметр.
Спецификация преобразования соответствует прототипу:
%[argnum$][flags][width][.precision]specifier.
Целое число, за которым идёт знак доллара $.
Число указывает порядковый номер аргумента, который требуется преобразовать.
| Флаг | Описание |
|---|---|
- |
Выравнивает значение по левому краю в пределах заданной ширины поля; по умолчанию значение выравнивается по правому краю. |
+ |
Выводит знак + перед неотрицательными числами;
по умолчанию только к отрицательным числам добавляется знак минус.
|
| (пробел) | Дополняет результат пробелами, которыми также при заданной ширине значение дополняется по умолчанию. |
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日
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
*/
?>Using the ... operator, vprintf($format, $array) is basically just printf($format, ...$array).<?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.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.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.";
?>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.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 recodingFor 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.