类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()
功能。
答
你可以用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
将被解释为变量并被替换为无。
(vprintf
和vsprintf
是专为数组,但你可以做同样的事情printf
和sprintf
用于分离变量,它的工作原理相同)
如果你不能改变你原来的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);
'str_replace()函数'没有它的工作 –
有'vsprintf'。 –
使用'printf'我强制按顺序创建数组,我可以使用数组索引来选择吗? – Coder