类Python .format()

问题描述:

我有以下阵列:类Python .format()

$matches[0] = "123"; 
$matches[1] = "987"; 
$matches[2] = "121"; 

而且下面的字符串:

$result = "My phone number is {0} and police number is {2}"; 

我想换成基于$matches阵列上的{}占位符,如果没有占位符的匹配,则不显示任何内容。

实现该目标的最佳方法是什么?或者您是否知道解决我的问题的更好方法?

(现在我建立的系统,所以不是大括号,我可以使用任何其他符号)

UPDATE

在Python中,这是可能使用.format()功能。

+0

'str_replace()函数'没有它的工作 –

+0

有'vsprintf'。 –

+0

使用'printf'我强制按顺序创建数组,我可以使用数组索引来选择吗? – Coder

你可以用vsprintf做到这一点,你没有,如果你给的编号(1)您的产品这样的改变项目的顺序:%n$s(其中n是数字):

$matches = [ "123", "987", "121"]; 
$result = 'My phone number is %1$s and police number is %3$s'; 

$res = vsprintf($result, $matches); 

请注意,您必须将格式化的字符串放在单引号之间,否则$s将被解释为变量并被替换为无。

vprintfvsprintf是专为数组,但你可以做同样的事情printfsprintf用于分离变量,它的工作原理相同)


如果你不能改变你原来的Python的格式化字符串,该方法是使用preg_replace_callback

$matches = [ "123", "987", "121"]; 
$result = 'My phone number is {0} and police number is {2}'; 

$res = preg_replace_callback('~{(\d+)}~', function ($m) use ($matches) { 
    return isset($matches[$m[1]]) ? $matches[$m[1]] : $m[0]; 
}, $result); 

,或者你可以建立一个关联数组,其中键PLACEHOLD ERS和值的数组值,并使用strtr用于替换:

$matches = [ "123", "987", "121"]; 
$result = 'My phone number is {0} and police number is {2}'; 

$trans = array_combine(
    array_map(function ($i) { return '{'.$i.'}'; }, array_keys($matches)), 
    $matches 
); 

$result = strtr($result, $trans); 
+0

它的工作原理,现在将测试它:) – Coder

+0

这里的代码:ideone.com/S12EXd也很好。非常感谢,接受是正确的答案,很干净。 – Coder

+0

邮件合并卷土重来。 – sln