Имя PHP-спецификаторы в printf() строках

Есть ли способ в PHP назвать мои спецификаторы, как в Python?

Я хочу это в PHP:

$foo = array('name' => 24);
printf("%(name)d", $foo);

Я не мог найти ничего связанного с Google или в руководстве по php.

Ответ 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% уверенной в конкретной версии, но должна быть там).

Посмотрите на действие.

Ответ 2

Вы можете сделать это с помощью sprintf путем нумерации параметров, например:

echo sprintf('hello, %2$s. What is your %1$s', 'age', 'Jesse');


Выводит следующую строку:

привет, Джесси. Ваш возраст

Ответ 3

Используйте strtr:

$foo = array('%name%' => 24);
strtr("%name%", $foo); // 24

Вы также можете сделать это:

"${foo['name']}"

Или это:

$name = 24;
"$name"

Ответ 4

более близкая основная функция vsprintf() использует массив вместо нескольких параметров, но вам все равно придется использовать нумерованные параметры.

в комментариях этой функции docs есть кто-то, кто создал функцию, чтобы сделать то, что вы хотите vnsprintf() printf + array + named parameters