PHP.mk документација

vsprintf

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.vsprintf.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.vsprintf.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
vsprintf

Референца за `function.vsprintf.php` со подобрена типографија и навигација.

function.vsprintf.php

vsprintf

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

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

= NULL

function vsprintf(string $format, array $values): string

Врати форматиран стринг sprintf() Работи како

Параметри

format

Низата за форматирање се состои од нула или повеќе директиви: обични знаци (со исклучок на %) што се копираат директно во резултатот и спецификации за конверзија, секоја од кои резултира со добивање на сопствен параметар.

Спецификацијата за конверзија следи овој прототип: %[argnum$][flags][width][.precision]specifier.

но прифаќа низа од аргументи, наместо променлив број на аргументи.

Цел број проследен со знак долар $, за да се специфицира кој број аргумент да се третира во конверзијата.

Argnum

Знаменце = NULL
- Порамни лево во дадената ширина на полето; Десното порамнување е стандардно
+ Префикс позитивни броеви со знак плус +; Стандардно само негативните се префиксирани со негативен знак.
Flags Ја пополнува низата со празни места. Ова е стандардно.
0 Само лево ги пополнува броевите со нули. Со s спецификатори ова може да ги пополни и десно со нули.
'(простор) Го полни резултатот со карактерот (char).

Ширина

Или цел број што кажува колку знаци (минимум) треба да резултира оваа конверзија, или *. Ако * се користи, тогаш ширината се дава како дополнителна цел вредност што му претходи на онаа форматирана од спецификаторот.

Прецизност

Период . опционално проследено со цел број или *, чие значење зависи од спецификаторот:

  • За e, E, f and F спецификатори: ова е бројот на цифри што треба да се испечатат по децималната точка (по дифолт, ова е 6).

  • За g, G, h and H спецификатори: ова е максималниот број на значајни цифри што треба да се испечатат.

  • За s спецификатор: делува како точка на прекин, поставувајќи максимално ограничување на карактерите на низата.

Забелешка:

Ако е специфициран периодот без експлицитна вредност за прецизност, се претпоставува 0. Ако * се користи, прецизноста се дава како дополнителна цел вредност што му претходи на онаа форматирана од спецификаторот.

Спецификатори
Спецификатор = NULL
% Буквален процентен знак. Не е потребен аргумент.
b Аргументот се третира како цел број и се претставува како бинарен број.
c Аргументот се третира како цел број и се претставува како карактер со таа ASCII.
d Аргументот се третира како цел број и се претставува како (потпишан) децимален број.
e Аргументот се третира како научна нотација (на пр. 1.2e+2).
E Како e спецификатор, но користи големи букви (на пр. 1.2E+2).
f Аргументот се третира како пловечки број и се прикажува како пловечки број (свесен за локалот).
F Аргументот се третира како пловечки број и се прикажува како пловечки број (не свесен за локалот).
g Општ формат. Нека P е еднакво на прецизноста ако е различно од нула, 6 ако прецизноста е изоставена или 1 ако прецизноста е нула. Потоа, ако конверзијата со стил E би имала експонент X: Ако P > X ≥ −4, конверзијата е со стил f и прецизност P − (X + 1). Во спротивно, конверзијата е со стил e и прецизност P − 1.
G Како g спецификатор, но користи E and f.
h Како g спецификатор, но користи F. Достапно од PHP 8.0.0.
H Како g спецификатор, но користи E and F. Достапно од PHP 8.0.0.
o Аргументот се третира како цел број и се прикажува како октален број.
s Аргументот се третира и прикажува како стринг.
u Аргументот се третира како цел број и се прикажува како непотпишан децимален број.
x Аргументот се третира како цел број и се прикажува како хексадецимален број (со мали букви).
X Аргументот се третира како цел број и се прикажува како хексадецимален број (со големи букви).
Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

На c спецификаторот за тип ги игнорира подлогата и ширината.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Обидот за користење комбинација од спецификаторите за стринг и ширина со множества знаци што бараат повеќе од еден бајт по знак може да резултира со неочекувани резултати.

Променливите ќе бидат претворени во соодветен тип за спецификаторот:

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

Вратени вредности

(знак) format.

Errors/Exceptions

Од PHP 8.0.0, а ValueError се фрла ако бројот на аргументи е нула. Пред PHP 8.0.0, а E_WARNING беше емитирано наместо тоа.

Од PHP 8.0.0, а ValueError се фрла ако [width] е помало од нула или поголемо од PHP_INT_MAX. Пред PHP 8.0.0, а E_WARNING беше емитирано наместо тоа.

Од PHP 8.0.0, а ValueError се фрла ако [precision] е помало од нула или поголемо од PHP_INT_MAX. Пред PHP 8.0.0, а E_WARNING беше емитирано наместо тоа.

Од PHP 8.0.0, а ValueError се фрла кога се даваат помалку аргументи отколку што е потребно. Пред PHP 8.0.0, false беше вратено и а E_WARNING емитирано наместо тоа.

Дневник на промени

Верзија = NULL
8.0.0 Оваа функција повеќе не враќа false при неуспех.
8.0.0 Фрли а ValueError ако бројот на аргументи е нула; претходно оваа функција емитираше а E_WARNING instead.
8.0.0 Фрли а ValueError if [width] е помало од нула или поголемо од PHP_INT_MAX; претходно оваа функција емитираше а E_WARNING instead.
8.0.0 Фрли а ValueError if [precision] е помало од нула или поголемо од PHP_INT_MAX; претходно оваа функција емитираше а E_WARNING instead.
8.0.0 Фрли а ValueError кога се даваат помалку аргументи отколку што е потребно; претходно оваа функција емитираше а E_WARNING instead.

Примери

Пример #1 vsprintf()Врати вредности од низата како форматиран стринг според

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

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

1988-08-01

Види Исто така

  • printf() Излез на стринг
  • sprintf() - Врати форматирана низа
  • fprintf() - Запиши форматирана низа во поток
  • vprintf() Излез на стринг
  • vfprintf() - Запиши форматирана низа во поток
  • sscanf() - Парсирај влез од низа според формат
  • fscanf() - Парсира влез од датотека според формат
  • number_format() - Заокружи дропки надолу
  • date() - Форматирај Unix временски печат

Белешки од корисници 11 белешки

spectrumcat
пред 9 години
Instead of inventing own functions in case you'd like to use array keys as placeholder names and replace corresponding array values in a string, just use the str_replace:

$string = 'Hello %name!';
$data = array(
  '%name' => 'John'
);

$greeting = str_replace(array_keys($data), array_values($data), $string);
: нула-пополнети цели броеви
пред 13 години
<?php
/**
 * Like vsprintf, but accepts $args keys instead of order index.
 * Both numeric and strings matching /[a-zA-Z0-9_-]+/ are allowed.
 *
 * Example: vskprintf('y = %y$d, x = %x$1.1f', array('x' => 1, 'y' => 2))
 * Result:  'y = 2, x = 1.0'
 *
 * $args also can be object, then it's properties are retrieved
 * using get_object_vars().
 *
 * '%s' without argument name works fine too. Everything vsprintf() can do
 * is supported.
 *
 * @author Josef Kufner <jkufner(at)gmail.com>
 */
function vksprintf($str, $args)
{
    if (is_object($args)) {
        $args = get_object_vars($args);
    }
    $map = array_flip(array_keys($args));
    $new_str = preg_replace_callback('/(^|[^%])%([a-zA-Z0-9_-]+)\$/',
            function($m) use ($map) { return $m[1].'%'.($map[$m[2]] + 1).'$'; },
            $str);
    return vsprintf($new_str, $args);
}
?>
steven на nevvix точка com
пред 8 години
<?php
/**
 * Return a formatted string like vsprintf() with named placeholders.
 *
 * When a placeholder doesn't have a matching key in `$args`,
 *   the placeholder is returned as is to see missing args.
 * @param string $format
 * @param array $args
 * @param string $pattern
 * @return string
 */
function p($format, array $args, $pattern="/\{(\w+)\}/") {
    return preg_replace_callback($pattern, function ($matches) use ($args) {
        return @$args[$matches[1]] ?: $matches[0];
    }, $format);
}

$args = ["database"=>"people", "user"=>"staff", "pass"=>"pass123", "host"=>"localhost"];

// With PHP-like placeholders: the variable is embedded in a string "{$database}" but without the dollar sign
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS {database};
GRANT ALL PRIVILEGES ON {database_name}.* TO '{user}'@'{host}';
SET PASSWORD = PASSWORD('{pass}');
SQL;
echo p($format, $args);
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON {database_name}.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `{database_name}` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/

// With Ruby-like placeholders
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS :database;
GRANT ALL PRIVILEGES ON :database_name.* TO ':user'@':host';
SET PASSWORD = PASSWORD(':pass');
SQL;
echo p($format, $args, "/:(\w+)/");
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON :database_name.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `:database_name` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/
crash
пред 5 години
Note that this function now throws an ValueError* as of PHP 8.0 if there is an error:

$ php -r 'var_dump(vsprintf("%d", []));'
> Fatal error: Uncaught ValueError: The arguments array must contain 1 items, 0 given in Command line code:1

*ValueError is new in PHP 8.0, so if you want to make your code compatible to PHP 7.x you should test that the arguments array has the correct length.
Josef Kufner
20 години пред
This can be used for quick and dirty internationalization:

<?php
$GLOBALS['strings']['example'] = "There are %d people.";

// Loads a phrase from the translations list in lang/$lang/phrases.php
function t() {
    $args = func_get_args();
    $nArgs = func_num_args();
    
    $phrase = array_shift($args);
    $nArgs--;
    
    include_once("../lang/" . lang() . "/phrases.php");
    if (isset($GLOBALS['strings'][$phrase])) {
        return vsprintf($GLOBALS['strings'][$phrase], $args);
    } else {
        return '<span style="color: #ff0000">Untranslated string: ' . $phrase . '</span>';
    }
}
?>
jon at ardentcreative dot co dot uk
пред 18 години
vnsprintf is equal to vsprintf except for associative, signed or floating keys.

vnsprintf supports for example "%assocKey$05d", "%-2$'+10s" and "%3.2$05u", vsprintf doesn't

vnsprintf( '%2$d', $array) [2nd value] is equal to vsprintf( '%2$d', $array) [2nd value]
vnsprintf( '%+2$d', $array) [key = 2] is equal to vnsprintf( '%2.0$d', $array) [key = 2]
vnsprintf( '%+2$d', $array) [key = 2] is different of vsprintf( '%+2$d', $array) [unsupported]

When you use signed or floating keys, vnsprintf searchs for the signed truncated key of the original array

Note¹: vnsprintf does not support for example "%someKeyf" (floating number, key = someKey) or "%+03d" (signed decimal number, key = 3), you should use "%someKey$f" or "%+03$d" respectively.
Note²: "%+03d" (or "%1$+03d") will be interpreted as signed zero-padded decimal number

<?php
function vnsprintf( $format, array $data)
{
    preg_match_all( '/ (?<!%) % ( (?: [[:alpha:]_-][[:alnum:]_-]* | ([-+])? [0-9]+ (?(2) (?:\.[0-9]+)? | \.[0-9]+ ) ) ) \$ [-+]? \'? .? -? [0-9]* (\.[0-9]+)? \w/x', $format, $match, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
    $offset = 0;
    $keys = array_keys($data);
    foreach ( $match as &$value )
    {
        if ( ( $key = array_search( $value[1][0], $keys) ) !== FALSE || ( is_numeric( $value[1][0]) && ( $key = array_search( (int)$value[1][0], $keys) ) !== FALSE ) ) {
            $len = strlen( $value[1][0]);
            $format = substr_replace( $format, 1 + $key, $offset + $value[1][1], $len);
            $offset -= $len - strlen( $key);
        }
    }
    return vsprintf( $format, $data);
}

$examples = array(
    2.8=>'positiveFloat',    // key = 2 , 1st value
    -3=>'negativeInteger',    // key = -3 , 2nd value
    'my_name'=>'someString'    // key = my_name , 3rd value
);

echo vsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // [unsupported]
echo vnsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // output : "someString"

echo vsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // output : "negativeInteger"

echo vsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : "negativeInteger"
echo vnsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : [= vsprintf]

echo vsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // output : "negativeInteger"
?>
www dot wesley at gmail dot com
19 години пред
Please note: The same functionality (sortof) can be attained between version 4.0.4 and 4.1.0 using call_user_func_array.

Example:

call_user_func_array("sprintf", $arg)

First element of $arg is the format. This rescued me in a situation where version 4.1.0 wasn't available.
Roadster
пред 13 години
Using a heredoc with vprintf:

<?php
$string = <<<THESTRING
I like the state of %1\$s <br />
I picked: %2\$d as a number, <br />
I also picked %2\$d as a number again <br />
%3\$s<br />
THESTRING;

$returnText = vprintf(  $string, array('Oregon','7','I Love Oregon')  );

echo $returnText;
?>
dee jay simple zero07 at geemail dawt co
пред 1 година
MessageFormatter::formatMessage(string $locale, string $pattern, array $values)

or 

msgfmt_format_message(string $locale, string $pattern, array $values)

can be an alternativ option:

$values = ['rank'=>10, 'name'=>'Frank']

MessageFormatter::formatMessage('en', 'Hello {name}, your rank is {rank}', $values);

Also access by index is possible "{1}", formating and a lot more.

https://unicode-org.github.io/icu/userguide/format_parse/numbers/
glueck at dozent dot net
пред 22 години
vsprintf() accepts arrays with any keys, so the array_shift() technique is unnecessary when writing a printf-type function. Any parameters you require are easily unset from the array you retrieve with func_get_args():

<?php

function mysprintf($format) {
    $args = func_get_args();
    unset($args[0]); /* get rid of "$format" */
    return vsprintf($format, $args);
}

/* I use this technique in production code as follows: */
function logf($target, $string) {
    $args = func_get_args();
    unset($args[0], $args[1]);
    fprintf($GLOBALS['config']['logtargets'][$target],
        "[%s] %s\n", date('H:i'), wordwrap(vsprintf($string, $args), 75, '\n\r '));
}

/* e.g.:
    logf(DEBUG, "Oops! %s", mysql_error());
 */

?>

array_shift() and other costly array operations aren't required, as far as I know. I could be wrong.
Tr909 at com dot nospam dot bigfoot
пред 8 години
It's necessary to clearly how to apply argument swapping when using an array of arguments. One might be tempted to use %0$ to reference $args[0].

In reality, the position specifier is always the array index+1:

$args[0]  is referenced by %1$...
$args[1]  is referenced by %2$... 
etc.

Similarly, the first subpattern of a RegEx match would be found in $matches[1], the second in $match[2], etc. However if the $matches array is used as arguments to vsprint(), then the position specifier is subpattern+1:

preg_match( $pattern, $subject, $matches );
vsprintf( 'Full Match = %1$s, first Subpattern = %2$s, second Subpattern = %3$s', $matches );
Навигација

Прелистувај сродни теми и функции.

На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.