Name PHP specifiers in printf() strings

后端 未结 4 2158
情书的邮戳
情书的邮戳 2021-02-19 18:47

Is there a way in PHP to name my specifiers like in Python?

I want this in PHP:

$foo = array(\'name\' => 24);
printf(\"%(name)d\", $foo);
相关标签:
4条回答
  • 2021-02-19 18:53

    the closer core function is vsprintf() to use an array instead of multiple parameter, but you still have to use numbered parameters.

    in the comments of this function docs there is someone who created a function to do what you want vnsprintf() printf+array+named parameters

    0 讨论(0)
  • 2021-02-19 19:02

    You can do it with sprintf by numbering the parameters, like so:

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


    Outputs the following string:

    hello, Jesse. What is your age

    0 讨论(0)
  • 2021-02-19 19:09

    Nice question!

    You can roll your own without too much trouble by working with regexes. I based the implementation on the idea of calling vsprintf, which is closest to the stated goal among the built-in printf family of functions:

    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);
    }
    

    To test:

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

    Update: My initial implementation was very lambda-happy. Turns out a super basic foreach will suffice, which also makes the function usable in PHP >= 4.1 (not 100% sure about the specific version, but should be around there).

    See it in action.

    0 讨论(0)
  • 2021-02-19 19:15

    Use strtr:

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

    You could also do this:

    "${foo['name']}"
    

    Or this:

    $name = 24;
    "$name"
    
    0 讨论(0)
提交回复
热议问题