Подстановка в строку значений из массива

gv0zd

Новичок
Подстановка в строку значений из массива

PHP:
$string = '{hi} меня {call} {name}';

$array = (
    'hi' => 'Привет',
    'call' => 'зовут',
    'name' => 'Вова');
Подскажите, можно подставить значения из массива без использования регулярных выражений?
Перерыл все строковые функции, но так ничего и не нашел.
Заранее спасибо
 

gv0zd

Новичок
str_replace не подходит так как содержание строки и массива может меняться
 

gv0zd

Новичок
Я сделаю уточнение, возможно я не полностью описал ситуацию, а то я не вижу как в моей ситуации можно применить str_replace

PHP:
$string = '{hi} меня {call} {name} {name2}';

$array = array (
    'id' => 1,    
    'age' => 18,
    'hi' => 'Привет',
    'call' => 'зовут',
    'name' => 'Вова',
    'name2' => 'Пупкин'
);
Результат должен быть:
Привет меня зовут Вова
Независимо от количества и порядка "тэгов" в строке и ключей и значений в массиве.

На данный момент я отлавливаю при помощи preg_match_all все элементы в тексте, которые заключены в фигурные скобки, а потом рекурсивно меняю их при помощи str_replace.

Просто для общего развития хочу понять можно ли это делать при помощи строковых функций не боясь того что допустим не коррекно будут отбработаны name и name2
 

Adelf

Administrator
Команда форума
PHP:
$string = '{hi} меня {call} {name} {name2}';

$array = array (
    'id' => 1,    
    'age' => 18,
    'hi' => 'Привет',
    'call' => 'зовут',
    'name' => 'Вова',
    'name2' => 'Пупкин'
);

$searchArrayKeys = array();
$searchArrayVals = array();
foreach($array as $key => $val)
{
    $searchArrayKeys[] = '{'.$key.'}';
    $searchArrayVals[] = $val;
}
print str_replace($searchArrayKeys, $searchArrayVals, $string);
Привет меня зовут Вова Пупкин
 

gv0zd

Новичок
Понял, спасибо, т.е. все равно рекурсия, но уже не через регулярки.
А то я подумал, что можно как-то напрямую str_replace.
Еще раз спасибо
 

Mols

Новичок
gv0zd
угу...
ток надо не забыть что иногда и вставляемые значения могут содержать текст типа "Вова {что-то} молодец".
Понятно, что редко. Но как ни крути, код приведённый выше для поставленной задачи подходит только, если вставляемые значения априори не могут содержать подстроку заключённую в фигурные скобки.
Это так?
 

Mols

Новичок
gv0zd
И да... почитайте, что такое рекурсия.
В коде приведённом выше рекурсии нет.
 

korpus

злой бобёр
Можно использоватьhttp://php.net/manual/en/function.strtr.php. Функция strtr проходит по строке один раз. А если надо заменять name и name2, то наверное, сначала вызывать замену name2, потом name.
 

gv0zd

Новичок
Основная задача была как раз в том чтоб не нужно было контролировать кто в каком порядке стоит в строке и в каком порядке в массиве
 

korpus

злой бобёр
В документации написано: strtr() will always look for the longest possible match first and will *NOT* try to replace stuff that it has already worked on. Т.е. даже name2 и name она заменит корректно.
 

gv0zd

Новичок
массив ко мне приходит именно в том виде что я указал.
Т.е. дял того чтоб сделать через strtr нужно все равно пробежаться по массиву и дописать к ключам { и }
Как вариант, спасибо
 
Сверху