палач “word” в php
-
20-09-2019 - |
Вопрос
Я пытаюсь сделать что-то похожее на hangman, где, когда вы угадываете букву, она заменяет подчеркивание на то, что это за буква.Я придумал способ, но он кажется очень неэффективным, и мне интересно, есть ли способ получше.Вот что у меня есть -
<?
$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');
и затем используйте array_diff ()
против $lettersGuessed, который выдаст вам массив не угаданных букв.Это, безусловно, сэкономило бы несколько строк кода.Такие , как:
$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__
Другие советы
Это массив, предполагается, что вы делаете foreach, в любом случае это происходит молниеносно, я думаю, вы зациклены на чем-то, что даже не является проблемой.
Вы хотите использовать массив, потому что вы можете легко определить, какие индексы в массиве содержат букву, которая напрямую соотносится с тем, в каком месте строки _ должно стать буквой.
Ваш цикл 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