2010-08-28 2 views
4

Je crée une application web où je veux que toutes les réponses à l'utilisateur soient stockées dans un fichier de langue pour faciliter l'édition. Alors Im utiliser pour gérer les messages dynamiques eval() Lik donc:fonction et performance 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; 


} 

Im se demander si cela est la meilleure approche ou s'il y a une meilleure façon?

Répondre

10

Ne jamais utiliser ce sacré eval si ce n'est pas nécessaire! Votre code ne fonctionnera pas, vous devez utiliser sprintf pour votre usage.

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

En supposant que vous utilisez cela pour des commentaires ou tout autre texte fourni par l'utilisateur, j'ai ajouté htmlentities() pour éviter XSS.

+0

Hmm, je ne savais pas que PHP avait une extension de variable en ligne comme Perl ... – polemon

+0

cela ne fonctionne tout simplement pas. –

+0

@KennyTM, mis à jour mon poste avec un meilleur code. – Lekensteyn

0

Je préfère cette façon:

<?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

Bien que ce ne soit pas ce que je cherchais, c'est intéressant. Comment cela se compare-t-il en performance à la solution sprintf? Plus précisément, s'il y avait une grande quantité de variables utilisées. – websiteguru

2

ce que vous avez besoin est la fonction printf. Vous pouvez définir une chaîne et avoir% s comme espace réservé pour une chaîne.

puis appelez

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

le premier% s sera remplacé par chaine1 $ et ainsi de suite.

dans votre exemple très j'utiliser vsprintf qui retourne la chaîne et vous pouvez donner un tableau afin que vous puissiez nourrir ce que chaque tableau de params et chaîne d'entrée que vous aimez

Heres votre exemple:

<? 
$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"; 
} 

l'utilisation array_combine qui crée des tableaux dans le format touches $ => $ valeurs qui font le tableau suivant:

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