Только что закончил выполнение этой функции. В принципе, предположим, что нужно просмотреть строку и попытаться найти любые переменные-заполнители, которые будут размещаться между двумя фигурными скобками {}
. Он захватывает значение между фигурными скобками и использует его для просмотра массива, где он должен соответствовать ключу. Затем он заменяет переменную фигурного скобки в строке значением в массиве соответствующего ключа.Замена переменных-заполнителей в строке
У этого есть несколько проблем, хотя. Во-первых, когда я var_dump($matches)
, он помещает помещает результаты в массив внутри массива. Поэтому я должен использовать два foreach()
только для получения правильных данных.
Я также чувствую себя тяжелым, и я смотрел на него, пытаясь сделать его лучше, но я несколько в тупике. Любые оптимизации, которые я пропустил?
function dynStr($str,$vars) {
preg_match_all("/\{[A-Z0-9_]+\}+/", $str, $matches);
foreach($matches as $match_group) {
foreach($match_group as $match) {
$match = str_replace("}", "", $match);
$match = str_replace("{", "", $match);
$match = strtolower($match);
$allowed = array_keys($vars);
$match_up = strtoupper($match);
$str = (in_array($match, $allowed)) ? str_replace("{".$match_up."}", $vars[$match], $str) : str_replace("{".$match_up."}", '', $str);
}
}
return $str;
}
$variables = array("first_name"=>"John","last_name"=>"Smith","status"=>"won");
$string = 'Dear {FIRST_NAME} {LAST_NAME}, we wanted to tell you that you {STATUS} the competition.';
echo dynStr($string,$variables);
//Would output: 'Dear John Smith, we wanted to tell you that you won the competition.'
Пожалуйста, предоставьте нам образец данных ($ ул & $) Варс – HamZa
Ваш подход является весьма неэффективным. Рассмотрим альтернативный подход: a) используйте 'preg_replace_callback', чтобы вернуть значение согласованного токена из' $ vars' без миллионов вызовов 'str_replace'; б) преобразуйте каждую запись в '$ vars', чтобы включить ведущую/конечную скобку, затем подайте' $ vars' в 'strtr'. – DCoder
Вы делаете это как учебное упражнение или для производства? если для производства вы можете захотеть взглянуть на библиотеку шаблонов, такую как 'smarty' – dm03514