Поделюсь куском кода, из класса, который сам использую в одном из проектов (это не готовый код для использования, а просто пара методов, вырезанная из контекста, но это может дать представление о том как решаются такие задачи)
/**
* Производит заливку шаблона значениями из массива
*
* Литералы шаблона вида {<liter_1>.<liter_2>...} будут заменены на соотвествующие значения из массива
* $data[<liter_1>][<liter_2>]...
*
* @param $template Шаблон, содержащий литералы
* @param $data Массив значений для подстановки
* @return string Преобразованная строка
*/
public function fill_template($template, $data)
{
preg_match_all('/\{([A-Za-z0-9_\.]+)\}/u', $template, $match);
list($snippets, $fillers) = $match;
if (!empty($snippets)) {
$fillers = array_map(function($filler) use ($data) {
$keys = explode('.', $filler);
return $this->array_find($keys, $data);
}, $fillers);
return strtr($template, array_combine($snippets, $fillers));
}
return $template;
}
/**
* Рекурсивно ищет значение в массиве в порядке обозначенным $keys
*
* @param array $keys Массив ключей в порядке поиска их в массиве
* @param array $data Массив значений для поиска
* @param string $default Значение по умолчанию, если нет соответствующего значения в массиве
* @return mixed
*/
public function array_find($keys, $data, $default = '')
{
if (!is_array($data) || empty($keys)) return $data;
$key = current($keys);
return (isset($data[$key]))
? $this->array_find(array_slice($keys, 1), $data[$key], $default)
: $default;
}
$user = [
'id' => 1,
'name' => 'Ivan Ivanov',
'role' => 'developer',
'salary' => 100
];
fill_template('/api/items/{id}/{name}', $user); // /api/items/1/Ivan Ivanov
upd: соответственно под свой шаблон нужно поменять строку
preg_match_all('/\{([A-Za-z0-9_\.]+)\}/u', $template, $match);
upd2: Занудам: Да, я знаю про
array_shift. :)