【问题标题】:Name PHP specifiers in printf() strings在 printf() 字符串中命名 PHP 说明符
【发布时间】:2011-11-18 02:41:36
【问题描述】:

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

我想要这个在 PHP 中:

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

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

【问题讨论】:

标签: php naming format-specifiers


【解决方案1】:

使用strtr:

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

你也可以do this:

"${foo['name']}"

或者这个:

$name = 24;
"$name"

【讨论】:

  • 但这丢弃了printf() 的其他功能,如填充、数字格式等。
  • @MichaelBerkowski OP 没有提及其他功能,至少没有明确提及(python 代码)。考虑到这一点,strstr 是 PHP 函数,可让您定义自己的说明符。至少那是我正在寻找的东西,谷歌把我带到了这里。
  • 不错。 Strtr 就是这样。如果您还想要 sprintf 功能,请一起使用: sprintf(strtr($str, $trans), ...)
【解决方案2】:

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

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


输出以下字符串:

你好,杰西。你几岁了

【讨论】:

  • @salathe 你有什么建设性的话要说吗?
  • 他可能的意思是,如果你使用 printf 代替,你可以跳过 echo。
【解决方案3】:

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

在这个函数文档的 cmets 中,有人创建了一个函数来做你想做的事情vnsprintf() printf+array+named parameters

【讨论】:

    【解决方案4】:

    好问题!

    通过使用正则表达式,您可以轻松实现自己的目标。我的实现基于调用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);
    }
    

    测试:

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

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

    See it in action.

    【讨论】:

    • 不错的答案!我想知道不使用任何正则表达式是否可以让它运行得更快。
    • @gilden:这不是问题,或者,如果您愿意,这是过早优化的危险途径。您的应用会整天使用受 CPU 限制的格式化字符串吗?
    • 当然不是,我只是好奇它是否有什么不同。我猜还没有高到足以考虑这样做。
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2011-05-23
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多