Estoy tratando de aprender más acerca de la función de PHP sprintf (), pero php.net no me ayude mucho, como todavía estoy confundido, ¿por qué quieres usar?

Echar un vistazo a mi ejemplo a continuación.

¿Por qué usar este:

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

Cuando este hace lo mismo y es más fácil escribir de la OMI:

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

Que me estoy perdiendo algo aquí?

  • +1, buena pregunta. Yo casi no la uso yo, así que estoy interesado en ver las respuestas.
  • Tenga en cuenta que los dos ejemplos no son equivalentes: la primera, simplemente asigna el resultado a $output, mientras que el segundo echo s de ella.
  • Yo personalmente lo uso cuando estoy en la concatenación de un montón de cosas. Sólo después de que me parece útil, para mejorar la legibilidad, principalmente.
InformationsquelleAutor JasonDavis | 2009-09-06

24 Comentarios

  1. 127

    sprintf tiene todas las capacidades de formato de la original printf que significa que usted puede hacer mucho más que sólo la inserción de los valores de la variable en las cadenas.

    Por ejemplo, especificar el número (formato hexadecimal, decimal, octal), número de decimales, relleno y más. Google para printf y vas a encontrar un montón de ejemplos. El artículo de wikipedia sobre printf debe empezar.

    • Años atrás escribí una buena función para zero-padding números. Utilizado durante siglos antes de darse cuenta de que simplemente podría hacer sprintf('%03d', $num)
    • PHP sprintf tiene todas las capacidades de formato … en realidad es que falta uno importante, %,8d por ejemplo, para obtener los bien alineados 8 dígitos y comas que separan entero. El uso de number_format es menos conveniente en un printf estilo.
    • Se puede romper esa cadena de formato (‘%03d’)? Creo que sería realmente útil. Gracias.
    • También se puede repetir y cambiar el orden de los argumentos para mostrar. por ejemplo, sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello'); resultando en Hello World, my name is also World.
  2. 76

    Hay muchos casos de uso para sprintf pero de una manera que yo uso de ellos es mediante el almacenamiento de 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:

    $name = 'Josh';
    //$stringFromDB = 'Hello, My Name is %s';
    $greeting = sprintf($stringFromDB, $name);
    //$greetting = 'Hello, My Name is Josh'

    Esencialmente permite que algunos de separación en el código. Si yo uso ‘Hola, Mi Nombre es %s’ en muchos lugares en mi código, la puedo cambiar a ‘%s es mi nombre de’ en un lugar y se actualiza en todas partes automáticamente, sin tener que ir a cada instancia y se mueven alrededor de concatenaciones.

    • Este. Ahora agregue numerada de los argumentos y de las traducciones :]
  3. 46

    Otro uso de sprintf está localizada en aplicaciones como los argumentos a sprintf no tiene que ser en el orden en que aparecen en la cadena de formato.

    Ejemplo:

    $color = 'blue';
    $item = 'pen';
    
    sprintf('I have a %s %s', $color, $item);

    Pero una lengua como el francés ordena las palabras de forma diferente:

    $color = 'bleu';
    $item = 'stylo';
    
    sprintf('J\'ai un %2$s %1$s', $color, $item);

    (Sí, mi francés chupa: aprendí alemán en la escuela!)

    En realidad, tendría que utilizar gettext para almacenar las cadenas localizadas, pero usted consigue la idea.


  4. 36

    Es más fácil de traducir.

    echo _('Here is the result: ') . $result . _(' for this date ') . $date;

    Traducción (gettext) las cadenas son ahora:

    • Aquí está el resultado:
    • para esta fecha

    Cuando se traduce a otro lenguaje sería imposible o resulta muy extraño frases.

    Ahora, si usted tiene

    echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);

    Traducción (gettext) de las cuerdas es ahora:

    • Aquí está el resultado: %s para esta fecha %s

    Que tiene mucho más sentido y es más flexible a traducir a otros idiomas

    • Veo que esto sería muy útil +1
    • A pesar de que las traducciones que probablemente sería mejor utilizar la posición de los especificadores, para permitir algo más de flexibilidad a la hora de traducir, yo.e: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date); Que permitiría una traducción a modificar la frase como For the date %2$s, the result is %1$s
    • A pesar de que incluso si no están presentes en la cadena original, usted puede ponerlos en la traducción y que van a trabajar.
  5. 16

    La mejor razón por la que he encontrado es que permite colocar todas las cadenas de idioma en su archivo de idioma eran personas pueden traducir y el fin de ellos, según sea necesario, sin embargo, aún saber que no importa qué formato de la cadena en la que desea mostrar el nombre de los usuarios.

    Por ejemplo, el sitio va a decir «Bienvenido de nuevo [[Usuario]]» en la parte superior de la página. Como el programador no sabe o cuidado cómo la interfaz de usuario de chicos que van a escribir que – usted acaba de saber que un usuario va a ser mostrado en algún lugar en un mensaje.

    Lo que no puede integrar el mensaje en su código sin preocuparse de lo que el mensaje realmente es.

    Lang archivo (EN_US):

    ...
    $lang['welcome_message'] = 'Welcome back %s';
    ...

    Entonces usted puede apoyar cualquier tipo de mensaje en cualquier idioma mediante el uso de este real de tu código php.

    sprintf($lang['welcome_message'], $user->name())
    • Nunca he tenido que preocuparte de hacer que los archivos de idioma, pero esto parece como una de las más útiles usos para mí
    • Este ejemplo también hizo perfecto sentido para mí, ya que no he hecho mucho multilang aplicaciones.
  6. 9

    ¿por qué quieres usar?

    Resulta muy útil cuando se utiliza un (externo) de origen para cadenas de idioma. Si usted necesita un número fijo de variables en un determinado multilingüe cadena, usted sólo necesita saber el orden correcto:

    en.txt

    not_found    = "%s could not be found."
    bad_argument = "Bad arguments for function %s."
    bad_arg_no   = "Bad argument %d for function %s."

    hu.txt

    not_found    = "A keresett eljárás (%s) nem található."
    bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
    bad_arg_no   = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."

    La inserción de variables incluso no tiene que estar al principio o al final en varios idiomas, sólo el orden de los asuntos.

    Por supuesto, usted puede escribir su propia función para realizar esta reemplazar, sin duda, incluso con alguna pequeña mejora en el rendimiento, pero es mucho más rápido a sólo (dado que tiene una clase Language para leer cadenas de idioma):

    /**
     * throws exception with message($name = "ExampleMethod"):
     *  - using en.txt: ExampleMethod could not be found.
     *  - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
     */
    throw new Exception(sprintf(Language::Get('not_found'), $name));
    
    /**
     * throws exception with message ($param_index = 3, $name = "ExampleMethod"):
     *  - using en.txt: Bad argument 3 for function ExampleMethod.
     *  - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
     */
    throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));

    También viene con la capacidad de printf, por lo tanto es también un one-liner para el formato de numerosos tipos de variables, por ejemplo:

  7. 8

    Como se ha mencionado, se le permite dar formato a los datos de entrada. Por ejemplo, obligando a 2dp, 4 dígitos, etc. Es muy útil para la construcción de MySQL query strings.

    Otra ventaja es que permite separar el diseño de la cadena a partir 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 de MySQL:

    //For security, you MUST sanitise ALL user input first, eg:
    $username = mysql_real_escape_string($_POST['username']); //etc.
    //Now creating the query:
    $query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

    Este método es, por supuesto, tienen otros usos, tales como cuando la salida de la impresión como HTML, etc.

    Edición: Por razones de seguridad, cuando se utiliza una técnica que el anterior debe higienizar todas las variables de entrada con mysql_real_escape_string() antes de usar este método, para evitar MySQL ataques de inserción. Si se analiza unsanitised de entrada, su sitio web y servidor hackeado. (Con excepción, por supuesto, las variables que han sido completamente construido por el código y están garantizados para estar seguros).

    • Ese código es vulnerable a inyección SQL. El uso de marcadores de posición, no de la consulta de interpolación!
    • Se utiliza como es, tienes razón. Lo siento, he modificado mi respuesta.
  8. 6

    Utilizando sprintf() es mucho más limpio y más seguro para el formato de la cadena.

    Por ejemplo, cuando usted está tratando con variables de entrada, evita sorpresas inesperadas especificando el formato esperado por adelantado (por ejemplo, que usted está esperando string [%s] o el número [%d]). Esto podría potencialmente ayuda con posible riesgo de La inyección de SQL, pero que no impide que si la cadena consisten en citas.

    También ayuda a lidiar con carrozas, puede especificar explícitamente el dígito de precisión (por ejemplo,%.2f) que te ahorra el uso de funciones de conversión.

    Otra de las ventajas es que la mayoría de los principales lenguajes de programación tienen su propia aplicación de sprintf(), así que una vez que se familiarice con él, es incluso más fácil de usar, más que el aprendizaje de un nuevo idioma (como la forma de concatenar cadenas de caracteres o la conversión de la flota).

    En resumen, es una buena práctica utilizar con el fin de tener un limpiador y el código más legible.

    Por ejemplo, véase el siguiente ejemplo real:

    $insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";

    O algún ejemplo sencillo que imprime por ejemplo,'1','2','3','4':

    print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";

    y la impresión con cadena con formato:

    printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);

    donde printf() es equivalente a sprintf(), pero genera una cadena con formato en lugar de devolverlo (a la variable).

    Que es más legible?

    • No estoy en desacuerdo pero también vale la pena mencionar que hice esta 6-7 años y pensando que puedo»t recuerdo una vez que he utilizado este desde luego! Espero encontrar un lugar para él algún día y creo que tiene un lugar divertido para pensar que no lo he utilizado ya que esta pregunta que hace muchos años!
    • Puedo decir que es algo similar a la configuración de las variables de PDO en PHP. También si quieres darle la legibilidad argumento, entonces en ese caso prefiero usar sprintf() divide en varias líneas, donde la cadena con marcadores de posición es de 1 línea y los valores están en una línea o incluso de varias líneas, a continuación, todas sangría correctamente. El uso de su demo en la forma que he descrito… i.imgur.com/DFi3ur8.png
    • Instrucciones preparadas en conjunto con los procedimientos almacenados es la mejor manera de prevenir la inyección de sql, no sprintf. Usted todavía puede fácilmente sql inject usar sprintf, si la cadena pasa a contener una sola cita
  9. 4

    Incluso yo, sin embargo, la misma cosa, a menos que la he usado recientemente. A la hora de generar los documentos basados en las entradas del usuario esto será muy útil.

    "<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";

    Que fácilmente puede ser escrito como

    sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);
    • O usted puede hacer esto: "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>". Sin EMBARGO, NO OLVIDES desinfectar la entrada del usuario o abrir su código de seguridad para vulnerabilidades XSS.
    • También puede usar sintaxis HEREDOC. En mi opinión, ambos son más fáciles de leer que el sprintf sintaxis.
  10. 4

    Este:

    "<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";

    También se podría haber escrito:

    "<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";

    En mi opinión, esto es más claro para leer, pero puedo ver el uso de la localización, o el formato.

  11. 3

    Algunos de los típicos casos donde se necesita un control más preciso sobre el formato de salida. Puede ser difícil, por ejemplo, asegúrese de que un determinado valor cantidad específica de espacios acolchado para la frente, dependiendo de su longitud, o que una serie es emitida en un determinado formato preciso.

    Hay un montón de ejemplos en el manual de PHP

    También lo que viene a tu ejemplo de «más fácil escribir».. Mientras el eco puede ser más fácil de escribir, el sprintf es más fácil de leer, especialmente si usted tiene un montón de variables.

    Otra razón para utilizar sprintf o printf podría ser que usted desea permitir que un usuario definir el formato de salida de algunos de valor de forma segura puede permitir definir un sprintf compatible con el formato de salida.

    Oh, y su ejemplo está mal, en realidad, por una parte. sprintf devuelve la cadena, pero echo no – echo inmediatamente salidas y no devuelve nada, mientras sprintf sólo devuelve.

  12. 3
    1. Si has usado C/C++, entonces usted podría ser utilizado para la función sprintf.

    2. Hay una buena probabilidad de que la segunda línea es menos eficiente. Eco está diseñado como una salida de comando, mientras que sprintf está diseñado para hacer token de cadena de sustitución. Yo no soy un PHP persona, pero sospecho que hay más objetos involucrados con el eco. Si actúa como Java sería, crea un nuevo hilo cada vez que algo se agrega a la lista, así que vas a terminar con 4 cadenas creadas.

    • Las últimas ediciones de Java convertir la concatenación de cadenas a un StringBuilder detrás de las escenas.
    • Cadenas en PHP no son objetos. El segundo ejemplo se utiliza una construcción de lenguaje en lugar de una llamada a función será tan imperceptiblemente más rápido.
  13. 3

    A veces tengo algo como esto, que me parece un poco más fácil de leer:

    $fileName = sprintf('thumb_%s.%s', 
                        $fileId,
                        $fileInfo['extension']);
  14. 3

    Yo suelo usar sprintf para asegurarse de que un id que vienen desde la entrada del usuario es un número entero, por ejemplo:

    //is better use prepared statements, but this is practical sometimes
    $query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);

    También se utiliza para hacer rudimentaria plantillas (para mensajes html u otras cosas), así que puedes usar la plantilla en muchos lugares:

    $mail_body = "Hello %s, ...";
    $oneMail = sprintf($mail_body, "Victor");
    $anotherMail = sprintf($mail_body, "Juan");

    Es muy útil también para dar formato a números en diferentes representaciones (octal, el control de la posición decimal, etc).

    • No es más fácil sólo para uso intval($_GET[«article_id»])? Bueno, en realidad se tardó más de escribir…*notas abajo de su método» Dag nabbit.
    • Para este tipo de código, el mejor uso de la incorporada en mysql_real_escape_string(): $consulta = sprintf(«SELECT * from artículos where id = %d», mysql_real_escape_string($_GET[‘article_id’]));
  15. 3
    define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');
    
    sprintf(TEXT_MESSAGE, "Var1");
    sprintf(TEXT_MESSAGE, "Var2");
    sprintf(TEXT_MESSAGE, "Var3");
  16. 3

    sprintf es especialmente útil cuando las cadenas de formato que utilizan los números. Por ejemplo,

    $oranges = -2.34;
    echo sprintf("There are %d oranges in the basket", $oranges);
    
    Output: There are -2 oranges in the basket

    Naranjas de formato es un número entero (-2), pero se envuelven alrededor de los números positivos si se utiliza %de u para los valores sin signo. Para evitar este comportamiento, yo uso el absoluto de la función, abs(), para redondear el número a cero de la siguiente manera:

    $oranges = -5.67;
    echo sprintf("There are %d oranges in the basket", abs($oranges));
    
    Output: There are 5 oranges in the basket

    El resultado final es un estado con alta legibilidad, la lógica de la construcción, borrar formato, y la flexibilidad para la inclusión de variables adicionales como sea necesario. Como el número de variables aumenta en combinación con las funciones que manipulan estas variables, los beneficios son más evidentes. Como un ejemplo final:

    $oranges = -3.14;
    $apples = 1.5;
    echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));
    
    Output: There are 3 oranges and 4 apples

    El lado izquierdo de la sprintf declaración expresa claramente la cadena y los tipos de valores esperados, mientras que el lado derecho claramente expresadas las variables utilizadas y cómo están siendo manipulados.

    • Yo estaba a punto de upvote su respuesta para su extellent primera frase («sprintf es especialmente útil cuando las cadenas de formato que utilizan los números»), que es de hecho el punto más importante de sprintf en PHP, pero luego al ver esas enrevesadas ejemplos de la creación de los frutos de la «falta» de frutas :), cada uno en varias ocasiones sólo mostrando %d (y abs(), que es irrelevante para el tema), en lugar de mostrar algunos de la gran cantidad de número de opciones de formato (que se sea pertinente), he cambiado mi mente. Pero si la actualización de la respuesta, yo todavía tengo mi upvote en la nevera para usted. 🙂 Thx, saludos!
  17. 3

    Bien, sprintf tiene muchas capacidades como la conocemos
    un ejemplo como el siguiente:

    Hace unos meses yo estaba en la necesidad de la conversión de segundos a horas:minutos:segundos formato
    Como $t = 494050 //seconds yo quería imprimir como 137 h 14 m 10 s así que se me ocurrió con la función php springf() me acaba de celebrar los segundos en $t y echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60); me da 137 h 14 m 10 s

    sprintf() la función es muy útil si sabemos cómo usarlo.

  18. 2

    El argumento es el mismo para el uso de plantillas. Usted querrá separar su Textsleev de los reales valores de la variable. Además de las competencias adicionales de sprintf que estamos mencionado acerca de que es sólo un estilo de cosa.

  19. 2

    Un muy buen caso de uso para usar sprintf es salida collar de formatos de números y también, cuando la mezcla de diferentes tipos en una cadena. Puede ser más fácil de leer en muchos casos, y lo hace super sencillo para imprimir las diferentes representaciones de la misma variable, especialmente en valores numéricos.

  20. 2

    Usar sprintf() la función sobre ordinario concatenación tiene la ventaja de que se pueden aplicar diferentes tipos de formato en las variables a ser concatenados.

    En su caso, usted tiene

    $output = sprintf("Here is the result: %s for this date %s", $result, $date);

    y

    $output = 'Here is the result: ' .$result. ' for this date ' .$date;

    Tomemos $result = 'passed'; date = '23rd';

    El uso ordinario de la concatenación sólo se puede obtener a la salida:

    Here is the result: passed for this date 23rd

    Sin embargo, si usted usa sprintf() usted puede obtener una modificación de salida, tales como:

    $output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
    echo $output;

    De salida:

    Here is the result: pass for this date 23
  21. 2

    sprintf() es bastante similar a printf(). Si usted sabe printf() en los detalles, a continuación, sprintf() e incluso vsprintf() no es realmente difícil de entender.

    una de las cosas que difiere sprintf() de printf() es que será necesario declarar una variable para capturar la salida de la función cuando no directamente de impresión/echo nada. Veamos los siguientes fragmentos de código:

    printf("Hello %s", "world"); //"Hello world"
    
    sprintf("Hello %s", "world"); //does not display anything
    
    echo sprintf("Hello %s", "world"); //"Hello world"
    
    $a = sprintf("Hello %s", "world"); //does not display anything
    
    echo $a;//"Hello world"

    Espero que ayude.

  22. 0

    Usted tiene que tener cuidado al usar sprintf en bucles:

    $a = 'Anton';
    $b = 'Bert';
    $c = 'Corni';
    $d = 'Dora';
    $e = 'Emiel';
    $f = 'Falk';
    $loops = 10000000;
    
    $time = microtime(true);
    
    for ($i = 0; $i < $loops; $i++)
    {
        $test = $a . $b . $c . $d . $e . $f;
    }
    
    $concatTime = microtime(true) - $time;
    
    $time = microtime(true);
    
    for ($i = 0; $i < $loops; $i++)
    {
        $test = "$a $b $c $d $e $f";
    }
    
    $concat2Time = microtime(true) - $time;
    
    $time = microtime(true);
    
    for ($i = 0; $i < $loops; $i++)
    {
        $test = sprintf('%s %s %s %s %s %s', $a, $b, $c, $d, $e, $f);
    }
    
    $sprintfTime = microtime(true) - $time;
    
    echo 'Loops: ' . $loops . '<br>';
    echo '\'$a . $b . $c . $d . $e . $f\'' . ' needs ' . $concatTime  . 's<br>';
    echo '"$a $b $c $d $e $f"' . ' needs ' . $concat2Time  . 's<br>';
    echo 'sprintf(\'%s %s %s %s %s %s\', $a, $b, $c, $d, $e, $f)' . ' needs ' . $sprintfTime  . 's<br>';

    Que conduce a los siguientes tiempos (en mi máquina local con PHP 7.2):

    Bucles: 10000000

    ‘$a . $b . $c . $d . $e . $f’ necesidades 1.4507689476013 s

    «$a $b $c $d $e $f» necesidades 1.9958319664001 s

    sprintf(‘%s %s %s %s %s %s», $a, $b, $c, $d $e $f) necesidades 9.1771278381348 s

  23. 0

    Yo lo uso para mensajes a los usuarios o a otros «bastante» tipos de funcionalidad. Por ejemplo, si sé que voy a usar el nombre del usuario.

    $name = 'Some dynamic name';

    Y tiene varios mensajes a utilizar en esa situación. (I. e., el bloqueo o la continuación de otro usuario)

    $messageBlock = 'You have blocked %s from accessing you.';
    $messageFollow = 'Following %s is a great idea!';

    Puede crear una función general que hace algo para el usuario y agregar esta cadena, y no importa lo que la estructura de la frase que debe buscar bastante agradable. Siempre me disgusta sólo concatenar cadenas juntos y constantemente utilizando la notación de punto y el cierre y la reapertura de las cadenas sólo para hacer una mirada de la oración bueno. Yo era un fan en un primer momento como la mayoría, pero esto parece bastante útil cuando varias cadenas necesidad de ser manipulado y no se desea codificar la colocación de la variable en cada momento.

    Lo pienso de ella, lo que se ve mejor?

    return $messageOne === true ? $name.'. Please use the next example' : 'Hi '.$name.', how are you?'

    O

    $message = $messageOne === true ? 'Option one %s' 
    : ($messageTwo === true ? 'Option Two %s maybe?' : '%s you can choose from tons of grammatical instances and not have to edit variable placement and strings');
    
    return sprintf($message, $name);

    Seguro que es un paso adicional, pero lo que si condicional cheques de hacer un montón de otros objetos funcionales, a continuación, las citas y anexando comienza a ponerse en el camino de la codificación funcional.

Dejar respuesta

Please enter your comment!
Please enter your name here