(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
vprintf — Muestra una string formateada
vprintf() muestra el array args,
como una string formateada gracias a format.
El formato es el mismo que el utilizado por sprintf() .
vprintf() funciona como printf() , pero acepta un array como argumento, en lugar de una lista de argumentos.
format%) que se
copian directamente al resultado y especificaciones de
conversión, cada una con su propio
parámetro.
Una especificación de conversión que sigue este prototipo:
%[argnum$][flags][width][.precision]specifier.
Un int seguido de un signo dólar $,
para especificar qué número de argumento tratar en la conversión.
| Bandera | Descripción |
|---|---|
- |
Justifica el texto a la izquierda dado el ancho del campo; la justificación a la derecha es el comportamiento predeterminado. |
+ |
Prefija los números positivos con un signo más
+; por defecto solo los
números negativos son prefijados con un signo negativo.
|
| (espacio) | Rellena el resultado con espacios. Esto es por defecto. |
0 |
Rellena solo los números a la izquierda con ceros. Con
el especificador s esto también puede rellenar
a la derecha con ceros.
|
'(char) |
Rellena el resultado con el carácter (char). |
Sea un entero indicando el número de caracteres (mínimo)
que esta conversión debe producir, o *.
Si * es utilizado, entonces el ancho es proporcionado
como un valor entero adicional precediendo al que se formatea
por el especificador.
Un punto . seguido opcionalmente sea
de un entero, o de *,
cuya significación depende del especificador:
e, E,
f y F
: esto es el número de dígitos a mostrar
después de la coma (por defecto, esto es 6).
g, G,
h y H
: esto es el número máximo de
dígitos significativos a mostrar.
s: actúa como un punto de corte,
definiendo un límite máximo de caracteres de la cadena.
Nota: Si el punto es especificado sin un valor explícito para la precisión, 0 es asumido. Si
*es utilizado, la precisión es proporcionada como un valor entero adicional precediendo al que se formatea por el especificador.
| Especificador | Descripción |
|---|---|
% |
Un carácter de porcentaje literal. No se necesita ningún argumento. |
b |
El argumento es tratado como un entero y presentado como un número binario. |
c |
El argumento es tratado como un entero y presentado como el carácter de código ASCII correspondiente. |
d |
El argumento es tratado como un entero y presentado como un número entero decimal (firmado). |
e |
El argumento es tratado como una notación científica (ej. 1.2e+2). |
E |
Como el especificador e pero utiliza una
letra mayúscula (por ejemplo 1.2E+2).
|
f |
El argumento es tratado como un número de coma flotante (tipo float ) y presentado como un número de coma flotante (teniendo en cuenta la configuración local). |
F |
El argumento es tratado como un número de coma flotante (tipo float ) y presentado como un número de coma flotante (sin tener en cuenta la configuración local). |
g |
Formato general. Sea P igual a la precisión si diferente de 0, 6 si la precisión es omitida o 1 si la precisión es cero. Entonces, si la conversión con el estilo E tuviera como exponente X: Si P > X ≥ −4, la conversión es con estilo f y precisión P − (X + 1). De lo contrario, la conversión es con el estilo e y precisión P - 1. |
G |
Como el especificador g pero utiliza
E y f.
|
h |
Como el especificador g pero utiliza F.
Disponible a partir de PHP 8.0.0.
|
H |
Como el especificador g pero utiliza
E y F. Disponible a partir de PHP 8.0.0.
|
o |
El argumento es tratado como un entero y presentado como un número octal. |
s |
El argumento es tratado y presentado como una cadena de caracteres. |
u |
El argumento es tratado como un entero y presentado como un número decimal no firmado. |
x |
El argumento es tratado como un entero y presentado como un número hexadecimal (las letras en minúsculas). |
X |
El argumento es tratado como un entero y presentado como un número hexadecimal (las letras en mayúsculas). |
El especificador de tipo c ignora el alineamiento y el tamaño.
Intentar utilizar una combinación de una cadena y especificadores con juegos de caracteres que necesitan más de un octeto por carácter dará un resultado inesperado.
Las variables serán forzadas a un tipo apropiado para el especificador:
| Tipo | Especificadores |
|---|---|
| string | s |
| int |
d,
u,
c,
o,
x,
X,
b
|
| float |
e,
E,
f,
F,
g,
G,
h,
H
|
valuesDevuelve la longitud de la string devuelta.
A partir de PHP 8.0.0, se lanza un ValueError si el número de argumentos es cero. Anterior a
PHP 8.0.0, se emitía un E_WARNING en su lugar.
A partir de PHP 8.0.0, se lanza un ValueError si [width] es menor que cero o mayor que PHP_INT_MAX .
Anterior a PHP 8.0.0, se emitía un E_WARNING en su lugar.
A partir de PHP 8.0.0, se lanza un ValueError si [precision] es menor que cero o mayor que PHP_INT_MAX .
Anterior a PHP 8.0.0, se emitía un E_WARNING en su lugar.
A partir de PHP 8.0.0, se lanza un ValueError cuando se proporcionan menos argumentos de los requeridos. Anterior a
PHP 8.0.0, se devolvía false y se emitía un E_WARNING en su lugar.
| Versión | Descripción |
|---|---|
| 8.0.0 |
Esta función ya no devuelve false en caso de fallo.
|
| 8.0.0 |
Lanza una ValueError si el número de argumentos es cero;
anteriormente, esta función emitía un E_WARNING .
|
| 8.0.0 |
Lanza una ValueError si [width] es inferior a cero o superior a PHP_INT_MAX ;
anteriormente, esta función emitía un E_WARNING .
|
| 8.0.0 |
Lanza una ValueError si [precision] es inferior a cero o superior a PHP_INT_MAX ;
anteriormente, esta función emitía un E_WARNING .
|
| 8.0.0 |
Lanza una ValueError cuando se proporcionan menos argumentos de los requeridos;
anteriormente, esta función emitía un E_WARNING .
|
Ejemplo #1 Ejemplo con vprintf(): enteros completados con ceros
<?php
vprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>El ejemplo anterior mostrará:
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.