在printf()字符串中命名PHP说明符

Pau*_*aul 11 php naming format-specifiers

PHP中是否有一种方法可以像Python一样命名我的说明符?

我想用PHP:

$foo = array('name' => 24);
printf("%(name)d", $foo);
Run Code Online (Sandbox Code Playgroud)

我在谷歌或php手册中找不到任何相关内容.

Jon*_*Jon 10

好问题!

通过使用正则表达式,您可以毫不费力地自己动手.我的实现基于调用的思想vsprintf,它最接近内置printf函数族中的既定目标:

function vsprintf_named($format, $args) {
    $names = preg_match_all('/%\((.*?)\)/', $format, $matches, PREG_SET_ORDER);

    $values = array();
    foreach($matches as $match) {
        $values[] = $args[$match[1]];
    }

    $format = preg_replace('/%\((.*?)\)/', '%', $format);
    return vsprintf($format, $values);
}
Run Code Online (Sandbox Code Playgroud)

去测试:

$foo = array('age' => 5, 'name' => 'john');
echo vsprintf_named("%(name)s is %(age)02d", $foo);
Run Code Online (Sandbox Code Playgroud)

更新:我最初的实施非常高兴.结果是一个超级基本foreach就足够了,这也使得该函数可以在PHP> = 4.1中使用(不是100%确定特定版本,但应该在那里).

看到它在行动.


Arn*_*anc 9

用途strtr:

$foo = array('%name%' => 24);
strtr("%name%", $foo); // 24
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

"${foo['name']}"
Run Code Online (Sandbox Code Playgroud)

或这个:

$name = 24;
"$name"
Run Code Online (Sandbox Code Playgroud)


Jes*_*nch 9

您可以sprintf通过编号参数来完成它,如下所示:

echo sprintf('hello, %2$s. What is your %1$s', 'age', 'Jesse');
Run Code Online (Sandbox Code Playgroud)


输出以下字符串:

你好,杰西.你几岁

  • 如果你使用printf,他可能意味着你可以跳过echo. (11认同)
  • @salathe你有什么建设性的话要说吗? (5认同)