2011-08-13 4 views

答えて

8

あなたはvsprintfを使用することができます?

vsprintf("This is a %s %s.", array("test", "phrase")); // "This is a test phrase." 

あなたが唯一持っている場合は、代わりに? %s:

$str = "This is a ? ?."; 
vsprintf(str_replace("?", "%s", $str), array("test", "phrase")); 
+0

ザ・OPは、 "どのように私は、変数の配列に* *単一の文字の複数の出現を置き換えることができますか?"、尋ねました。 'vsprintf'は書式指定子(少なくとも2文字で、そのうちの1つは'% 'です)を置き換えるものです。 –

+1

@Delan Azabani:正確に 'これは%s%sです。 '文字列を得るには'?'を '%s'に置き換えるのは難しくありません。 – zerkms

+0

vsprintfに感謝します。挑戦的に最も単純な答え。 – ATLChris

1

方法:

$str = 'This is a ? ?.'; 

$replacement = array('test', 'phrase'); 

foreach ($replacement as $word) { 
    if (($pos = strpos($str, '?')) !== false) { 
     $str = substr_replace($str, $word, $pos, 1); 
    } 
} 

var_dump($str); 

Running sample on ideone.com

3

ここでは非常に簡潔なソリューションです:

$in = 'This is a ? ?.'; 
$ar = array('test', 'phrase'); 
foreach ($ar as $rep) 
    $in = implode($rep, explode('?', $in, 2)); 

$inは今、最終的な文字列です。

コメント:

  • 配列要素よりも多くの疑問符がある場合には、過剰疑問符が疑問符よりも多くの配列要素が存在する場合、必要なものだけが
  • に使用されます
  • 残ります最終的な文字列に疑問符をつけ、あなたの配列に'?'置換を入れ

例:http://codepad.org/TKeubNFJ

2

いつも機能する関数を書くのはどれくらい難しいですか?これまでの投稿の答えのすべてが、次の入力文字列と置換値に対して誤った結果が得られます:

$in="This i%s my ? input ? string"; 
$replace=array("jo%shn?",3); 

ワンしばしば見過ごさ問題は、入力文字列を変更した場合、元の入力パターンを含む置換値があるかもしれないということです再び置き換えられました。これを解決するには、新しい文字列をすべて作成する必要があります。また、sprintfの解決法では、入力文字列に '%s'が含まれていないと誤った仮定をしています。元のポスターはそのようなことは一度も言わなかったので、 '%s'は残しておくべきです。

代わりにこの機能をお試しください。それは最も速くないか、最も洗練された解決策ではないかもしれませんが、少なくとも入力に関係なく、賢明な(ああ)出力結果を提供します。

function replace_questionmarks($in,$replace) 
{ 
    $out=""; 
    $x=0; 
    foreach (explode("?",$in) as $part) 
    { 
     $out.=$part; 
     $out.=$replace[$x++]; 
    } 
    return $out; 
} 

$in="This i%s my ? input ? string"; 
$replace=array("jo%shn?",3); 
print replace_questionmarks($in,$replace); 

出力:

This i%s my jo%shn? input 3 string