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

时间:2011-09-15 17:48:08

标签: php naming format-specifiers

PHP中有没有办法像Python一样命名我的说明符?

我想在PHP中使用它:

$foo = array('name' => 24);
printf("%(name)d", $foo);

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

4 个答案:

答案 0 :(得分:10)

好问题!

使用正则表达式,您可以毫不费力地自己动手。我的实现基于调用vsprintf的想法,See it in action最接近内置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);
}

测试:

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

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

<强> {{3}}

答案 1 :(得分:9)

使用strtr

$foo = array('%name%' => 24);
strtr("%name%", $foo); // 24

你也可以do this

"${foo['name']}"

或者这个:

$name = 24;
"$name"

答案 2 :(得分:9)

您可以使用sprintf对参数进行编号,如下所示:

echo sprintf('hello, %2$s. What is your %1$s', 'age', 'Jesse');


输出以下字符串:

  你好,杰西。你的年龄是多少

答案 3 :(得分:0)

较近的核心函数vsprintf()使用数组而不是多个参数,但您仍然必须使用编号参数。

在此函数文档的评论中,有人创建了一个函数来执行您想要的操作vnsprintf() printf+array+named parameters