質問
私はあなたの手紙を推測するとき、それは文字が何であるかをアンダースコアに置き換えられ絞首刑執行人に似た何かをしようとしています。私は道が出ているが、それは非常に非効率ですし、もっと良い方法があれば、私は疑問に思って。ここで私が持っているものである -
<?
$word = 'ball';
$lettersGuessed = array('b','a');
echo str_replace( $lettersGuessed , '_' , $word ); // __ll
echo '<br>';
$wordArray = str_split ( $word );
foreach ( $wordArray as $letterCheck )
{
if ( in_array( $letterCheck, $lettersGuessed ) )
{
$finalWord .= $letterCheck;
} else {
$finalWord .= '_';
}
}
echo $finalWord; // ba__
?>
str_replace
は、私が何をしたいの反対を行います。私は$finalWord
の値は私が望む結果を得るためにループを経由することなく、あるものを望んます。
解決
私はあなたが右あなたが最初の行の反対をしたい、次の午前場合:
echo str_replace( $lettersGuessed , '_' , $word ); // __ll
なぜ$opposite = range('a', 'z');
の配列を作成し、あなたにunguessed文字の配列を与える$ lettersGuessed、反対array_diff ()
使用しません。それは確かに数行のコードを保存します。以下のような:
$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__
他のヒント
foreachのは、あなたがやっていると仮定しているものである配列だ、それはとにかく超高速ですが、私はあなたにも、問題ではない何かもこだわるていると思います。
あなたは簡単に直接文字列内のどの場所_文字になるべきと相関手紙を、含まれているものであり、アレイ内のどのインデックス伝えることができるbecuase配列を使用したい。
あなたのforeachループは、それを行うには細かい方法です。あなたの言葉が巨大になることはありませんので、それは遅くなりません。
また、それらの文字以外のすべてを置き換えるために推測文字で正規表現パターンを作成することができます。このように:
$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/'; // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
別の方法は、アレイ、例えばとして文字列をアクセスするであろう。
$word = 'ball';
$length = strlen($word);
$mask = str_pad('', $length, '_');
$guessed = 'l';
for($i = 0; $i < $length; $i++) {
if($word[$i] === $guessed) {
$mask[$i] = $guessed;
}
}
echo $mask; // __ll
所属していません StackOverflow