¿PHP tiene un equivalente a este tipo de sustitución de cadenas de Python?
Pregunta
Python tiene esta maravillosa manera de manejar las sustituciones de cadenas usando diccionarios:
>>> 'The %(site)s site %(adj)s because it %(adj)s' % {'site':'Stackoverflow', 'adj':'rocks'}
'The Stackoverflow site rocks because it rocks'
Me encanta esto porque puedes especificar un valor una vez en el diccionario y luego reemplazarlo en todas partes de la cadena.
Intenté lograr algo similar en PHP usando varias funciones de reemplazo de cadenas, pero todo lo que se me ocurrió se siente incómodo.
¿Alguien tiene una manera limpia y agradable de realizar este tipo de sustitución de cadenas en PHP?
Editar
Aquí está el código de la página de sprintf que más me gustó.
<?php
function sprintf3($str, $vars, $char = '%')
{
$tmp = array();
foreach($vars as $k => $v)
{
$tmp[$char . $k . $char] = $v;
}
return str_replace(array_keys($tmp), array_values($tmp), $str);
}
echo sprintf3( 'The %site% site %adj% because it %adj%', array('site'=>'Stackoverflow', 'adj'=>'rocks'));
?>
Solución
function subst($str, $dict){
return preg_replace(array_map(create_function('$a', 'return "/%\\($a\\)s/";'), array_keys($dict)), array_values($dict), $str);
}
Lo llamas así:
echo subst('The %(site)s site %(adj)s because it %(adj)s', array('site'=>'Stackoverflow', 'adj'=>'rocks'));
Otros consejos
No sé si es más rápido, pero puedes hacerlo sin expresiones regulares:
function subst($str, $dict)
{
foreach ($dict AS $key, $value)
{
$str = str_replace($key, $value, $str);
}
return $str;
}
Algunas de las notas y funciones aportadas por los usuarios en Documentación de PHP para sprintf acercarse bastante.
Nota:busque en la página "sprintf2".