Ответ 1
Хороший вопрос!
С помощью регулярных выражений вы можете самостоятельно катиться без особых проблем. Я основал реализацию идеи о вызове 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% уверенной в конкретной версии, но должна быть там).