2010-01-13 6 views
0

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

<? 
$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 не нужно проходить через цикл, чтобы получить желаемый результат.

+0

Существует ли регулярное выражение в PHP? Если это так, вы можете заменить все возникновение или. (который является любым символом) с помощью _. В Perl это будет похоже на thist: s /./_/ g –

ответ

2

Если я после вас правильно вы хотите сделать противоположное первой линии:

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

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

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

+0

, так что вы рекомендуете в качестве решения? – scott

1

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

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

$word = 'ball'; 
$lettersGuessed = array('b','a'); 
$pattern = '/[^' . implode('', $lettersGuessed) . ']/'; // results in '/[^ba]/ 
$maskedWord = preg_replace($pattern, '_', $word); 
echo $maskedWord; 
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