В строке формата (%1$s
) вы видите то, что называется замена аргумента (подробное понимание см. В примерах 1-4).
Вы бы использовали его, если порядок ваших заполнителей отличается от порядка аргументов. Пример:
У вас есть строка
$str = "%s had a %s %s";
и массив
$args = [
'Mary',
'little',
'lamb',
];
И результатом твоего форматирования будет "У Мэри был маленький ягненок". Но что произойдет, если аргументы будут в другом порядке, например:
$args = [
'lamb',
'Mary',
'little',
];
Тогда вы получите "Ягненок имел маленькую Марию". Используя подстановку аргументов (я знаю, запутанное имя), вы указываете форматировщику, где именно искать данный аргумент. Эти заполнители настраиваются по позициям, а не по индексу, поэтому они начинаются с 1, а не с 0.
Таким образом, чтобы получить правильный вывод для вышеупомянутых неупорядоченных аргументов, вам понадобится строка формата:
$str = "%2$s had a %3$s %1$s";
Обратите внимание, что замена аргументов имеет смысл тогда и только тогда, когда вы можете гарантировать, что порядок аргументов в вашем массиве всегда будет одинаковым. Кроме того, если вы не можете контролировать порядок аргументов (но можете гарантировать, что он будет таким же), вам, скорее всего, придется его использовать.
Как заметил Бернд Уилк πφ , обмен аргументами очень полезен при работе с локализацией, как, например, в вашем случае.
Разные языки имеют разные языковые типологии, то есть где, например, субъект, глагол и объект помещаются в предложение или даже как написана дата.
Стандартный английский формат даты, например, month-day-year
. В Германии он отформатирован как day.month.year
, а в японском - year-month-date
. Теперь, когда вы получаете массив аргументов откуда угодно, содержащий значения для года, месяца и дня, в следующем порядке
$arguments = [
"2019",
"03",
"20",
];
вы бы не обошлись, используя подстановку аргументов для размещения элементов в правильном порядке.
На английском языке ваша строка формата будет %2$s-%3$s-%1$s
, для немецкого %3$.%2$.%1$
и для японского %1$s-%2$s-%3$s
или даже %s-%s-%s
(по совпадению, аргументы уже в правильном порядке, но во избежание путаницы и оставайтесь последовательными, вы должны использовать позиционное форматирование, как и в других языках).
Когда вы можете управлять порядком аргументов, обычно проще использовать непозиционную строку форматирования, но, как объяснено выше, это не очень хорошо работает для локализации, если вообще.