Назовите спецификаторы PHP в строках printf () - PullRequest
11 голосов
/ 15 сентября 2011

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

Я хочу это в PHP:

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

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

Ответы [ 4 ]

10 голосов
/ 15 сентября 2011

Хороший вопрос!

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

Увидеть это в действии .

9 голосов
/ 15 сентября 2011

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

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


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

привет, Джесси. Сколько тебе лет

9 голосов
/ 15 сентября 2011

Использование strtr:

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

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

"${foo['name']}"

Или это:

$name = 24;
"$name"
0 голосов
/ 15 сентября 2011

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

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

...