题
我试图做类似的刽子手一些地方,当你猜的信,它取代下划线的字母是什么。我想出了一个办法,但似乎非常低效的,我想知道是否有更好的方法。以下是我有 -
<?
$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,它会给你的unguessed字母的排列。这肯定会节省几行代码。如:
$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;
另一种方法是访问字符串作为一个数组,e.g。
$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