PHP equivalent of Python's `str.format` method?

后端 未结 3 2207
难免孤独
难免孤独 2021-02-19 21:06

Is there an equivalent of Python str.format in PHP?

In Python:

\"my {} {} cat\".format(\"red\", \"fat\")

All I see I can d

相关标签:
3条回答
  • 2021-02-19 21:26

    sprintf is the closest thing. It's the old-style Python string formatting:

    sprintf("my %s %s cat", "red", "fat")
    
    0 讨论(0)
  • 2021-02-19 21:36

    As PHP doesn't really have a proper alternative to str.format in Python, I decided to implement my very simple own which as most of the basic functionnalitites of the Python's one.

    function format($msg, $vars)
    {
        $vars = (array)$vars;
    
        $msg = preg_replace_callback('#\{\}#', function($r){
            static $i = 0;
            return '{'.($i++).'}';
        }, $msg);
    
        return str_replace(
            array_map(function($k) {
                return '{'.$k.'}';
            }, array_keys($vars)),
    
            array_values($vars),
    
            $msg
        );
    }
    
    # Samples:
    
    # Hello foo and bar
    echo format('Hello {} and {}.', array('foo', 'bar'));
    
    # Hello Mom
    echo format('Hello {}', 'Mom');
    
    # Hello foo, bar and foo
    echo format('Hello {}, {1} and {0}', array('foo', 'bar'));
    
    # I'm not a fool nor a bar
    echo format('I\'m not a {foo} nor a {}', array('foo' => 'fool', 'bar'));
    
    1. The order doesn't matter,
    2. You can omit the name/number if you want it to simply increment (the first {} matched will be transformed into {0}, etc),
    3. You can name your parameters,
    4. You can mix the three other points.
    0 讨论(0)
  • 2021-02-19 21:51

    I know it's an old question, but I believe strtr with replace pairs deserves to be mentioned:

    (PHP 4, PHP 5, PHP 7)

    strtr — Translate characters or replace substrings

    Description:

    strtr ( string $str , string $from , string $to ) : string
    strtr ( string $str , array $replace_pairs ) : string
    
    <?php
    var_dump(
    strtr(
        "test {test1} {test1} test1 {test2}",
        [
            "{test1}" => "two",
            "{test2}" => "four",
            "test1" => "three",
            "test" => "one"
        ]
    ));
    
    ?>
    

    this code would output:

    string(22) "one two two three four" 
    

    Same output is generated even if you change the array items order:

    <?php
    var_dump(
    strtr(
        "test {test1} {test1} test1 {test2}",
        [
            "test" => "one",
            "test1" => "three",
            "{test1}" => "two",
            "{test2}" => "four"
        ]
    ));
    
    ?>
    
    string(22) "one two two three four"
    
    0 讨论(0)
提交回复
热议问题