2010-08-03 7 views
0

J'ai une chaîne avec le même caractère plusieurs fois et je veux remplacer chaque occurrence de ce caractère par une chaîne différente d'un tableau. C'est à dire. comme dans les déclarations préparées:Remplace le même caractère plusieurs fois avec une chaîne différente

Chaîne: "SELECT * FROM x WHERE a = ? AND b = ?"
Tableau: ['alpha', 'beta']

Résultat: "SELECT * FROM x WHERE a = alpha AND b = beta"

+0

quelle interface base de données utilisez-vous? Il a probablement cette capacité intégrée (et c'est probablement plus sûr). – strager

+0

Oui, bien sûr, les interfaces de base de données sont généralement intégrées, mais je voulais juste utiliser la syntaxe SQL comme exemple parce que la plupart des gens le savent déjà. Il y a déjà quelques bonnes solutions ici, j'essaie simplement de déterminer laquelle fonctionne le mieux pour moi. – Matt

Répondre

7

Si vous avez le contrôle sur ce que le caractère de remplacement est, utilisez sprintf

sprintf('Hello %s, how %s %s?', 'World', 'are', 'you'); 

ou vsprintf:

vsprintf('Hello %s, how %s %s?', array('World', 'are', 'you')); 

Et même si vous ne le faites pas:

$str = 'Hello ?, I hope ? ?.'; 
$str = str_replace('?', '%s', $str); 
$str = sprintf($str, "World", "you're", "fine"); 
+0

Cela peut être difficile à utiliser d'une manière programmatique car le nombre de remplacements peut ne pas être corrigé. ['vsprintf'] (http://www.php.net/manual/fr/function.vsprintf.php) est une meilleure solution. – Artefacto

+0

Bon point, dépend de la façon dont il est censé être utilisé. – deceze

+0

@Deceze bien, il dit spécifiquement "à partir d'un tableau", même si je concède que les OP pointent souvent à mi-chemin vers une solution qui ne répond pas vraiment à leur problème sous-jacent. – Artefacto

3

Essayez ceci:

$str = "SELECT * FROM x WHERE a = ? AND b = ?"; 
$arr = array("alpha", "beta"); 
foreach ($arr as $s) 
    $str = preg_replace("/\?/", $s, $str, 1); 
echo $str; 

Voir here. Le quatrième paramètre limite les remplacements maximum par passage à un au lieu de illimité.

+1

C'est peut-être parce que je pense que l'expression régulière est la magie du diable, mais est-ce que cela ne semble pas juste un peu obtus? Voyant que modifier le paramètre de la question juste un peu fait beaucoup plus de solution globale. (Voir sprintf) –

+0

Oui, vous avez probablement raison, sprintf sera probablement suffisant pour les besoins de l'auteur. Cependant, il n'utilise pas de tableau tel qu'il a été spécifié dans la question d'origine, ce qui en fait une approche plus générique (disons que vous avez besoin du tableau). – XQYZ

+0

Il y a le 'vsprintf' et il pourrait aussi utiliser' sprintf' + 'call_user_func' (bien que le dernier soit inconfortable). – Artefacto

1

Sans fonctions regex (en bonus, permet également le remplacement de chaînes arbitraires, pas seulement des caractères):

function replacement($string, $search, array $replacements) { 
    $pos = 0; 
    while (($f = strpos($string, $search, $pos)) !== FALSE) { 
     $r = array_shift($replacements); 
     $string = substr($string, 0, $f) . $r . 
      substr($string, $f + strlen($search)); 
     $pos = $f + strlen($r); 
    } 
    return $string; 
} 

Exemple:

echo replacement("sf sdf aaasdf sdsaaaaggg", "aa", 
    array("alpha", "beta", "gammma")); 

donne:

 
sf sdf alphaasdf sdsbetagammmaggg
Questions connexes