2010-01-29 6 views
1

Je dois remplacer plusieurs instances d'une certaine chaîne (point d'interrogation) par des chaînes d'un tableau. par exemple. si la chaîne que je souhaite remplacer apparaît 3 fois et que ma matrice a une longueur de 3, le premier sera remplacé par le premier élément du tableau, le second par le second etc etcRemplacement multiple (probablement preg_replace) de la même chaîne avec le tableau

Vous pouvez recongiler c'est assez similaire à la façon dont les instructions préparées fonctionnent dans mysqli.

Voici un exemple:

 
$myArray = array(
    [0] => 'yellow', 
    [1] => 'green', 
    [2] => 'red' 
); 

$myString = 'banana is ?, apple is ?, tomato is ?'; 

$newString = someFunction($myString,$myArray); 

echo $newString; 

Ce serait alors revenir

 
banana is yellow, apple is green, tomato is red 

Quelqu'un peut-il suggérer une façon de le faire en utilisant PHP 5.2.

Répondre

5

pourquoi ne pas utiliser

$retString = vsprintf('banana is %s, apple is %s, tomato is %s', $myArray); 
return $retString; 
+0

+1 C'est la meilleure solution. – mck89

+0

Hmm J'ai complètement oublié sprintf (c'est une de ces fonctions que je n'ai jamais vraiment utilisées pour une raison quelconque). Cela fonctionnerait vraiment très bien, bien que dans mon cas, je doive utiliser des points d'interrogation, donc je vais devoir faire un peu de remplacement, mais infact, dans mon cas particulier, cela fonctionnera bien. Solution acceptée, merci beaucoup. – Rob

+0

bien si vous faites un remplacement simple, vous pouvez toujours faire quelque chose comme 'str_replace ($ str, '?', '$ S');':] Content de l'avoir aidé. –

2

Il est un peu laid en PHP 5.2 parce que vous devez utiliser des variables globales pour transmettre des informations entre les callbacks mais il est très flexible autrement. Utilisez preg_replace_callback():

preg_replace_callback('!\?!', 'rep_array', $myString); 

$i = 0; 

function rep_array($matches) { 
    global $myArray; 
    return $myArray[$i++]; 
} 

Il faudrait répondre pour qu'il y ait plus de ? que les entrées du tableau, ainsi que remettre le compteur à chaque appel.

Adam a raison de dire que sprintf() est un peu plus propre mais que vous ne contrôlez pas toujours la chaîne d'entrée. preg_replace_callback peut répondre à un éventail de circonstances beaucoup plus large.

Questions connexes