2010-08-28 62 views
4

我创建了一个Web应用程序,我希望所有对用户的响应都存储在语言文件中以便于编辑。所以我使用eval()来管理动态消息像这样:php评估函数和性能

$msg = 'Hello $user, your favorite color is $color'; 

$colors = array("red","green","blue","yellow"); 
$users = array("bob","craig","ted","dirty sanchez"); 

foreach($users as $key => $user){ 

$color = $colors[$key]; 
eval("\$newmsg = \"$msg\";"); 
echo $newmsg; 


} 

我想知道这是最好的方法还是有更好的方法?

回答

10

不要使用那该死的评估,如果没有必要! 您的代码将无法使用,您应该使用sprintf达到您的目的。

$messageFormat = 'Hello %s, your favorite color is %s'; 

$colors = array("red","green","blue","yellow"); 
$users = array("bob","craig","ted","dirty sanchez"); 
foreach($users as $key => $user){ 
    $color = $colors[$key]; 
    $actualMessage = sprintf($messageFormat, $user, $color); 
    echo htmlentities($actualMessage); 
} 

你使用这个征求意见或其他用户提供的文本假设,我已经添加htmlentities()防止XSS

+0

嗯,我不知道PHP有内联变量扩展像Perl ... – polemon 2010-08-28 19:46:45

+0

这只是不工作。 – 2010-08-28 19:48:13

+0

@KennyTM,用更好的代码更新了我的文章。 – Lekensteyn 2010-08-28 19:49:40

0

我更喜欢这种方式:

<?php 

$msg = 'Hello [USER], your favorite color is [COLOR]'; 

$colors = array("red","green","blue","yellow"); 
$users = array("bob","craig","ted","dirty sanchez"); 

foreach($users as $key => $user) 
{ 
    $color = $colors[$key]; 

    $newmsg = str_replace(array('[USER]', '[COLOR]'), array($user, $color), $msg); 
    echo $newmsg; 
} 
?> 
+0

虽然不是我正在寻找的东西,但这很有趣。这与sprintf解决方案的性能相比如何?特别是如果有大量的变量使用。 – websiteguru 2010-08-28 23:34:33

2

你需要的是printf函数。 您可以定义一个字符串并将%s作为字符串的占位符。

然后调用

printf($variable, $string1, $string2, $string); 

第一个%s得到由$字符串1等取代。

在你非常比如我会用vsprintf中返回的字符串,你可以给一个数组,所以你可以给它什么则params的每一个阵列和输入字符串你喜欢

继承人的例子:

<? 
$msg = 'Hello %s, your favorite color is %s'; 
$colors = array("red","green","blue","yellow"); 
$users = array("bob","craig","ted","dirty sanchez"); 
foreach($users as $key => $user){ 
$color = $colors[$key]; 
$newmsg = vsprintf($msg,array($user,$color)); 
echo $newmsg."\n"; 
} 

?> 
0
$colors = array("red","green","blue","yellow"); 
$users = array("bob","craig","ted","dirty sanchez"); 
$messages = array_combine($colors, $users); 

foreach ($messages as $color => $user) 
{ 
    echo "Hello $user, your favourite color is $color"; 
} 

使用array_combine这在格式$创建阵列密钥=> $进行以下数组值:

"red" => "bob", 
"green" => "craig", 
"blue" => "ted", 
"yellow" => "dirty sanches"