Подобный Python .format () в переполнении стека

У меня есть следующий массив:

$matches[0] = "123";
$matches[1] = "987";
$matches[2] = "121";

И следующая строка:

$result = "My phone number is {0} and police number is {2}";

Я хотел бы заменить {} заполнитель на основе $matches массив, в случае если нет соответствия для отображения пустых мест вместо этого.

Каков наилучший способ достичь этого, или вы знаете лучшее решение моей проблемы?

(Сейчас я строю систему, поэтому вместо фигурных скобок я мог бы использовать любой другой символ)

В питоне это возможно используя .format() функция.

4

Решение

Вы можете сделать это с vsprintfвам не нужно менять порядок элементов, если вы даете номер (от 1) вашего элемента следующим образом: %n$s (где n — число):

$matches = [ "123", "987", "121"];
$result = 'My phone number is %1$s and police number is %3$s';

$res = vsprintf($result, $matches);

Обратите внимание, что вы должны поместить форматированную строку между одинарными кавычками, в противном случае $s будет интерпретироваться как переменная и заменяться ничем.

(vprintf а также vsprintf предназначены для массивов, но вы можете сделать то же самое с printf а также sprintf для разделенных переменных работает одинаково)


Если вы не можете изменить исходную строку в формате Python, используйте preg_replace_callback:

$matches = [ "123", "987", "121"];
$result = 'My phone number is {0} and police number is {2}';

$res = preg_replace_callback('~{(\d+)}~', function ($m) use ($matches) {
return isset($matches[$m[1]]) ? $matches[$m[1]] : $m[0];
}, $result);

или вы можете создать ассоциативный массив, где ключи являются заполнителями и значениями вашего массива, и использовать strtr для замены:

$matches = [ "123", "987", "121"];
$result = 'My phone number is {0} and police number is {2}';

$trans = array_combine(
array_map(function ($i) { return '{'.$i.'}'; }, array_keys($matches)),
$matches
);

$result = strtr($result, $trans);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]