Is there an equivalent of Python str.format in PHP?
In Python:
"my {} {} cat".format("red", "fat")
All I see I can do in PHP natively is by naming the entries and using str_replace:
str_replace(array('{attr1}', '{attr2}'), array('red', 'fat'), 'my {attr1} {attr2} cat')
Is there any other PHP's native alternatives?
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"
                        sprintf is the closest thing. It's the old-style Python string formatting:
sprintf("my %s %s cat", "red", "fat")
                        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'));
{} matched will be transformed into {0}, etc),If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With