命名绑定变量在字符串中?

时间:2010-08-16 18:52:41

标签: php data-binding string

我正在寻找像sprintf()这样的函数,除了用sprintf()你按参数的顺序绑定值,我想要一些我可以按名称绑定变量的东西。所以,如果我有字符串"Hello $name! We're please to have you visit, $name!",你可以传递数组或其他内容并从中获取结果字符串。

类似于PDO语句,但仅适用于普通字符串,而不是数据库查询。我可以使用什么?

3 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:2)

PHP内置支持评估双引号字符串中的变量。虽然您无法将数组“传入”它,但您可以将当前变量范围视为字符串构建器“function”的输入。

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

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

修改

更灵活的解决方案可能是将代码抽象为闭包。这不依赖于eval,并且可能运行得更快。

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

//Hello User and Kendall
$hello_two( array( "var1" => "User", "var2" => "Kendall" ) );

答案 2 :(得分:0)

也许你可以使用anonymous functions,这样自由变量被绑定为匿名函数中的参数,匿名函数返回一个字符串,其中的值填充了自由变量。这可以与闭包中的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的范围控制机制有点可怕,因此您可能需要验证这不会将变量泄漏到整个范围内。它也值得投入。