именованная привязка переменных в строках? - PullRequest
1 голос
/ 16 августа 2010

Я ищу функцию, подобную sprintf (), за исключением того, что с помощью sprintf () вы связываете значения в порядке аргументов, я хочу что-то, где я могу связывать переменные по имени.Итак, если бы у меня была строка "Hello $name! We're please to have you visit, $name!", вы могли бы передать массив или что-то и получить из него результирующую строку.

Что-то вроде операторов PDO, но только для простых строк, а не запросов к базе данных.Что я могу использовать?

Ответы [ 3 ]

4 голосов
/ 17 августа 2010

preg_replace / e или preg_replace_callback - ваша лучшая ставка

  $vars = array('name' => 'Joe', 'age' => 25);
  $str = "@name is @age years old";
  echo preg_replace('/@(\w+)/e', '$vars["$1"]', $str);
2 голосов
/ 16 августа 2010

PHP имеет встроенную поддержку для оценки переменных внутри строк в двойных кавычках. Хотя вы не можете «передать» массив в него, вы можете рассматривать текущую область видимости переменной как вход для «функции» строителя строк.

$name = "Kendall Hopkins";
print "Hello {$name}!"; //Hello Kendall Hopkins!

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

EDIT:

Более гибким решением может быть абстрагирование кода в замыкание. Это не зависит от eval и, вероятно, будет работать быстрее.

$hello_two = function ( array $params ) {
    extract( $params );
    return "Hello $name1 and $name2!";
}

//Hello User and Kendall
$hello_two( array( "var1" => "User", "var2" => "Kendall" ) );
0 голосов
/ 16 августа 2010

Возможно, вы могли бы использовать анонимные функции , чтобы свободные переменные были связаны как параметры в анонимной функции, которая возвращает строку со значениями, заполняющими свободные переменные.Это будет хорошо работать в сочетании с функцией extract внутри замыкания, в которой ключи из вашего массива становятся действительными переменными в локальной области, необходимой для оценки переменных, указанных в строке формата.

Или, возможно, существует относительно простая версия, использующая eval (это просто иллюстрация, а не проверенный код):

function named_printf ($format_string, $values) {
    extract($values);
    $result = $format_string;
    eval('$result = "'.$format_string.'";');
    return $result;
}

echo named_printf ('Hello $msg', array('msg'=>'World'));

Механизмы управления областью действия PHP немного пугающие, поэтому вы можете убедиться, что этоне собирается пропускать переменные в область видимости повсюду.Также стоило бы проанализировать вклад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...