палач "слово" в php - PullRequest
       1

палач "слово" в php

0 голосов
/ 13 января 2010

Я пытаюсь сделать что-то похожее на палач, где, когда вы угадываете букву, она заменяет подчеркивание тем, что это за буква. Я придумал способ, но он кажется очень неэффективным, и мне интересно, есть ли лучший путь. Вот что у меня есть -

<?
$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 ]

2 голосов
/ 13 января 2010

Если я правильно следую за вами, вы хотите сделать обратное первой строке:

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__
2 голосов
/ 13 января 2010

Это массив, foreach - это то, что вы предполагаете делать, в любом случае он молниеносен, я думаю, вы одержимы чем-то, что даже не является проблемой.

Вы хотите использовать массив, потому что вы можете легко определить, какие индексы в массиве являются теми, которые содержат букву, что напрямую связано с тем, какое место в строке _ должно стать буквой.

1 голос
/ 13 января 2010

Ваш цикл foreach - прекрасный способ сделать это. Это не будет медленным, потому что ваши слова никогда не будут огромными.

Вы также можете создать шаблон регулярного выражения с угаданными буквами, чтобы заменить все, кроме этих букв. Как это:

$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/';   // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
0 голосов
/ 13 января 2010

Другой способ - получить доступ к строке в виде массива, например,

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...