Хороший вопрос!
Вы можете работать без особых проблем, работая с регулярными выражениями.Я основал реализацию на идее вызова vsprintf
, которая наиболее близка к заявленной цели из встроенного семейства функций printf
:
function vsprintf_named($format, $args) {
$names = preg_match_all('/%\((.*?)\)/', $format, $matches, PREG_SET_ORDER);
$values = array();
foreach($matches as $match) {
$values[] = $args[$match[1]];
}
$format = preg_replace('/%\((.*?)\)/', '%', $format);
return vsprintf($format, $values);
}
Для проверки:
$foo = array('age' => 5, 'name' => 'john');
echo vsprintf_named("%(name)s is %(age)02d", $foo);
Обновление: Моя первоначальная реализация была очень радостной.Оказывается, достаточно базового foreach
, что также делает функцию пригодной для использования в PHP> = 4.1 (не на 100% уверена в конкретной версии, но должна быть там).
Увидеть это в действии .