У меня есть следующий массив:
$matches[0] = "123";
$matches[1] = "987";
$matches[2] = "121";
И следующая строка:
$result = "My phone number is {0} and police number is {2}";
Я хотел бы заменить {}
заполнитель на основе $matches
массив, в случае если нет соответствия для отображения пустых мест вместо этого.
Каков наилучший способ достичь этого, или вы знаете лучшее решение моей проблемы?
(Сейчас я строю систему, поэтому вместо фигурных скобок я мог бы использовать любой другой символ)
В питоне это возможно используя .format()
функция.
Вы можете сделать это с 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);
Других решений пока нет …