Estoy tratando de aprender más sobre la función sprintf () de PHP, pero php.net no me ayudó mucho ya que todavía estoy confundido, ¿por qué querrías usarlo?
Echa un vistazo a mi ejemplo a continuación.
Por qué usar esto:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
Cuando esto hace lo mismo y es más fácil escribir IMO:
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
¿Me estoy perdiendo de algo?
$output
, mientras que el segundoecho
es el mismo.Respuestas:
sprintf
tiene todas las capacidades de formato del printf original, lo que significa que puede hacer mucho más que simplemente insertar valores variables en cadenas.Por ejemplo, especifique el formato de número (hexadecimal, decimal, octal), número de decimales, relleno y más. Google para printf y encontrarás muchos ejemplos. El artículo de wikipedia sobre printf debería ayudarlo a comenzar.
fuente
sprintf('%03d', $num)
%,8d
por ejemplo, para obtener el entero de 8 dígitos correctamente alineado y separado por comas. Usarnumber_format
es menos conveniente en unprintf
estilo.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
lo que resulta enHello World, my name is also World.
Hay muchos casos de uso para sprintf, pero una forma en que los uso es almacenando una cadena como esta: 'Hola, mi nombre es% s' en una base de datos o como una constante en una clase de PHP. De esa manera, cuando quiero usar esa cadena, simplemente puedo hacer esto:
Básicamente, permite cierta separación en el código. Si uso 'Hola, mi nombre es% s' en muchos lugares de mi código, puedo cambiarlo a '% s es mi nombre' en un lugar y se actualiza automáticamente en cualquier otro lugar, sin tener que ir a cada instancia y moverse. concatenaciones
fuente
Otro uso de
sprintf
es en aplicaciones localizadas como argumentos parasprintf
no tener que estar en el orden en que aparecen en la cadena de formato.Ejemplo:
Pero un idioma como el francés ordena las palabras de manera diferente:
(Sí, mi francés apesta: ¡aprendí alemán en la escuela!)
En realidad, usaría gettext para almacenar las cadenas localizadas, pero se entiende la idea.
fuente
Es más fácil traducir.
Las cadenas de traducción (gettext) ahora son:
Cuando se traduce a otro idioma, puede ser imposible o resultar en oraciones muy extrañas.
Ahora si tienes
Las cadenas de traducción (gettext) ahora son:
Lo que tiene mucho más sentido y es mucho más flexible para traducir a otros idiomas
fuente
echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);
Eso permitiría que una traducción modifique la frase comoFor the date %2$s, the result is %1$s
La mejor razón que he encontrado es que le permite colocar todas las cadenas de idioma en su archivo de idioma donde las personas pueden traducirlas y ordenarlas según sea necesario; sin embargo, todavía sabe que, sin importar en qué formato esté la cadena, desea mostrar El nombre del usuario.
Por ejemplo, su sitio dirá "Bienvenido de nuevo [[Usuario]]" en la parte superior de la página. Como programador, no sabes ni te importa cómo van a escribir eso los chicos de la interfaz de usuario; solo sabes que el nombre de un usuario se mostrará en algún lugar de un mensaje.
Por lo tanto, puede incrustar el mensaje en su código sin preocuparse por lo que realmente es ese mensaje.
Archivo Lang (EN_US):
Entonces puede admitir cualquier tipo de mensaje en cualquier idioma al usar esto en su código php real.
fuente
Es muy útil cuando se usa una fuente (externa) para cadenas de idioma. Si necesita un número fijo de variables en una cadena multilingüe dada, solo necesita saber el orden correcto:
en.txt
hu.txt
Las variables insertadas ni siquiera tienen que estar al principio o al final en varios idiomas, solo su orden importa.
Por supuesto, podría escribir su propia función para realizar este reemplazo, sin duda, incluso con algunos aumentos menores de rendimiento, pero es mucho más rápido simplemente (dado que tiene una clase
Language
para leer cadenas de idioma) :También viene con todas las capacidades de
printf
, por lo tanto, también es una línea para formatear numerosos tipos de variables, por ejemplo:fuente
Como se mencionó, permite formatear los datos de entrada. Por ejemplo, forzar números de 2dp, 4 dígitos, etc. Es bastante útil para construir cadenas de consulta MySQL.
Otra ventaja es que le permite separar el diseño de la cadena de los datos que se introducen en ella, casi como la alimentación en los parámetros. Por ejemplo, en el caso de una consulta MySQL:
Por supuesto, este método tiene otros usos, como cuando se imprime como HTML, etc.
Editar: por razones de seguridad , al usar una técnica como la anterior , debe desinfectar todas las variables de entrada
mysql_real_escape_string()
antes de usar este método , para evitar ataques de inserción de MySQL. Si analiza la entrada sin desinfectar, su sitio y servidor serán pirateados . (Con la excepción de, por supuesto, las variables que han sido completamente construidas por su código y se garantiza que sean seguras).fuente
Usar sprintf () es mucho más limpio y seguro para formatear su cadena.
Por ejemplo, cuando se trata de variables de entrada, evita sorpresas inesperadas al especificar el formato esperado de antemano (por ejemplo, que espera una cadena [
%s
] o el número [%d
]). Potencialmente, esto podría ayudar con el posible riesgo de inyección de SQL , pero no evitará si las cadenas consisten en comillas.También ayuda a tratar con flotantes, puede especificar explícitamente la precisión de los dígitos (por ejemplo
%.2f
) que le ahorra el uso de funciones de conversión.La otra ventaja es que la mayoría de los principales lenguajes de programación tienen su propia implementación
sprintf()
, por lo que una vez que te familiarizas con él, es aún más fácil de usar, en lugar de aprender un nuevo lenguaje (como cómo concatenar cadenas o convertir los flotantes).En resumen, es una buena práctica usar para tener un código más limpio y más legible.
Por ejemplo, vea el siguiente ejemplo real :
O algún ejemplo simple que imprima, por ejemplo
'1','2','3','4'
:e impresión con cadena formateada:
donde
printf()
es equivalente asprintf()
, pero genera una cadena con formato en lugar de devolverla (a la variable).¿Cuál es más legible?
fuente
sprintf()
líneas divididas en múltiples líneas donde la cadena con marcadores de posición está en 1 línea y los valores están en una línea o incluso en varias líneas debajo de ella, todo sangrado correctamente de curso. Usando su demo de la manera que describí ... i.imgur.com/DFi3ur8.pngAunque pensé lo mismo a menos que lo haya usado recientemente. Cuando genere documentos basados en las entradas del usuario, esto será útil.
Que se puede escribir fácilmente como
fuente
"<p>Some big paragraph {$a['name']} more words {$a['age']}</p>"
. SIN EMBARGO, NO OLVIDE desinfectar la entrada del usuario o abra su código hasta vulnerabilidades XSS.Esta:
También podría escribirse:
En mi opinión, esto es más claro de leer, pero puedo ver el uso para localizar o formatear.
fuente
Algunos de los casos típicos son donde necesita un control más preciso sobre el formato de salida. Puede ser complicado, por ejemplo, asegurarse de que un valor específico tenga una cantidad específica de espacios acolchados al frente, dependiendo de su longitud, o que un número se emita en un formato preciso específico.
Hay muchos ejemplos en el manual de PHP
También lo que viene a su ejemplo de "más fácil de escribir". Si bien el eco puede ser más fácil de escribir, el sprintf es más fácil de leer, especialmente si tiene muchas variables.
Otra razón para usar sprintf o printf podría ser que desee permitir que un usuario defina el formato de salida de algún valor; puede permitirle de manera segura que defina un formato de salida compatible con sprintf.
Ah, y su ejemplo es realmente incorrecto para una parte.
sprintf
devuelve la cadena, peroecho
no lo hace:echo
la emite inmediatamente y no devuelve nada, mientras quesprintf
solo la devuelve.fuente
Si ha usado C / C ++, entonces estaría acostumbrado a la función sprintf.
Existe una buena posibilidad de que la segunda línea sea menos eficiente. Echo está diseñado como un comando de salida, mientras que sprintf está diseñado para hacer una sustitución de token de cadena. No soy una persona PHP, pero sospecho que hay más objetos involucrados con el eco. Si actúa como lo haría Java, crea una nueva cadena cada vez que se agrega algo a la lista, por lo que terminaría con 4 cadenas creadas.
fuente
A veces tengo algo como esto, que considero un poco más fácil de leer:
fuente
Por lo general, uso sprintf para garantizar que una identificación que proviene de la entrada del usuario sea un número entero, por ejemplo:
También se usa para hacer plantillas rudimentarias (para correos html u otras cosas), por lo que puede reutilizar la plantilla en muchos lugares:
También es muy útil para formatear números en diferentes representaciones (octal, controlar el lugar decimal, etc.).
fuente
fuente
sprintf es particularmente útil al formatear cadenas que usan números. Por ejemplo,
Las naranjas están formateadas como un número entero (-2), pero se ajustarán a números positivos si se usa% u para valores sin signo. Para evitar este comportamiento, uso la función absoluta, abs (), para redondear el número hacia cero de la siguiente manera:
El resultado final es una declaración con alta legibilidad, construcción lógica, formato claro y flexibilidad para agregar variables adicionales según sea necesario. A medida que aumenta el número de variables en combinación con funciones que manipulan estas variables, los beneficios se hacen más evidentes. Como último ejemplo:
El lado izquierdo de la declaración sprintf expresa claramente la cadena y los tipos de valores esperados, mientras que el lado derecho expresa claramente las variables utilizadas y cómo se están manipulando.
fuente
sprintf
PHP, pero luego vi esos ejemplos intrincados que crean frutos de "falta" frutas :), cada una de las cuales solo muestra repetidamente%d
(yabs()
, lo que es irrelevante para el tema), en lugar de mostrar algunas de las muchas opciones de formato de números (que serían relevantes), cambié de opinión. Pero si actualiza la respuesta, todavía tendré mi voto a favor en la nevera. :) Gracias, saludos!Bueno,
sprintf
tiene muchas capacidades, ya que conocemos un ejemplo a continuación:Hace unos meses necesitaba convertir segundos a formato hora: minuto: segundos Como
$t = 494050 //seconds
quería imprimir,137 h 14 m 10 s
así que se me ocurrió la función php,springf()
solo guardo los segundos$t
yecho sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
me da137 h 14 m 10 s
La función sprintf () es muy útil si sabemos cómo usarla.
fuente
El argumento es el mismo para usar plantillas. Querrá separar su Textsleev de los valores de las variables reales. Además de los poderes adicionales de sprintf que mencionamos, es solo una cuestión de estilo.
fuente
Un caso de uso realmente bueno para usar sprintf es generar formatos de números rellenados y también, al mezclar diferentes tipos en una cadena. Puede ser más fácil de leer en muchos casos y hace que sea muy simple imprimir diferentes representaciones de la misma variable, especialmente las numéricas.
fuente
El uso de la función sprintf () sobre la concatenación ordinaria tiene la ventaja de que puede aplicar diferentes tipos de formato en las variables a concatenar.
En tu caso, tienes
y
Tomemos
$result = 'passed'; date = '23rd';
Usando la concatenación ordinaria solo puede obtener la salida:
Sin embargo, si lo usa
sprintf()
, puede obtener una salida modificada como:Salida:
fuente
sprintf()
es bastante similar aprintf()
. Si lo sabesprintf()
en detalle entoncessprintf()
e inclusovsprintf()
no es realmente difícil de entender.una de las cosas que se diferencia
sprintf()
deprintf()
es que tendrá que declarar una variable para captar la salida de la función, ya que no se imprime directamente / echo nada. Veamos los siguientes fragmentos de código:Espero que ayude.
fuente
Una "produce", la otra "devuelve", esa es una de las principales diferencias.
printf()
Salidassprintf()
Devolucionesfuente
Debes tener cuidado al usar sprintf en bucles:
Lo que conduce a los siguientes tiempos (en mi máquina local con PHP 7.2):
Lazos: 10000000
'$ a. $ b. $ c. $ d. $ e. $ f 'necesita 1.4507689476013s
"$ a $ b $ c $ d $ e $ f" necesita 1.9958319664001s
sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) necesita 9.1771278381348s
fuente
Lo uso para mensajes a los usuarios u otros tipos de funcionalidades "bonitas". Por ejemplo, si sé que voy a usar el nombre del usuario.
Y tener múltiples mensajes para usar en esa situación. (Es decir, bloquear o seguir a otro usuario)
Puede crear una función general que haga algo al usuario y agregar esta cadena, y no importa cuál sea la estructura de la oración, debería verse bastante bien. Siempre me disgusta simplemente agregar cadenas juntas y usar constantemente la notación de puntos y cerrar y volver a abrir cadenas solo para que una oración se vea bien. Al principio era un fanático como la mayoría, pero esto parece bastante útil cuando es necesario manipular varias cadenas y no desea codificar la ubicación de la variable en todo momento.
Piénsalo, ¿qué se ve mejor?
O
Claro que es un paso adicional, pero ¿qué pasa si sus comprobaciones condicionales hacen un montón de otras cosas funcionales, entonces las citas y los anexos comienzan a obstaculizar la codificación funcional?
fuente