0

私は絞首刑執行人に似た何かをしようとしています。文字を推測すると、アンダースコアが文字の代わりになります。私は方法を考え出しましたが、それは非常に非効率的であるように思われ、より良い方法があるかどうか疑問に思っています。これが私が持っているものです-

<?
$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希望する結果を得るためにループを通過することなく、その価値が何であるかを知りたいのです。

4

4 に答える 4

2

それは配列です、foreachはあなたがしていると思われることです、それはとにかく超高速です、私はあなたが問題さえない何かに取りつかれていると思います。

配列のどのインデックスが文字を含むインデックスであるかを簡単に判断できるため、配列を使用する必要があります。これは、文字列のどの場所に_が文字になるかを直接関連付けます。

于 2010-01-13T14:27:11.837 に答える
2

私があなたを正しくフォローしているなら、あなたは最初の行の反対をしたいと思うでしょう:

echo str_replace( $lettersGuessed , '_' , $word ); // __ll

の配列を作成してから$lettersGuessedに対して$opposite = range('a', 'z');使用すると、推測されていない文字の配列が得られます。array_diff ()それは確かに数行のコードを節約するでしょう。そのような:

$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__
于 2010-01-13T14:31:18.783 に答える
1

foreachループはそれを行うための優れた方法です。あなたの言葉が決して大きくなることはないので、それは遅くなることはありません。

推測された文字を使用して正規表現パターンを作成し、それらの文字を除くすべてを置き換えることもできます。このような:

$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/';   // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
于 2010-01-13T14:35:16.953 に答える
0

別の方法は、文字列に配列としてアクセスすることです。

$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
于 2010-01-13T14:36:47.183 に答える