我正在尝试做一些类似于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
的价值,而不必通过循环来获得我想要的结果。
答案 0 :(得分:2)
这是一个数组,foreach就是你想要做的事情,无论如何它都闪电般快,我认为你对一些甚至不是问题的东西都很着迷。
你想使用一个数组,因为你可以很容易地判断数组中的哪些索引是包含字母的索引,这与字符串中哪个_应该成为一个字母直接相关。
答案 1 :(得分:2)
如果我跟着你,你想要做第一行的反面:
echo str_replace( $lettersGuessed , '_' , $word ); // __ll
为什么不创建一个$opposite = range('a', 'z');
数组,然后对$ lettersGuessed使用array_diff ()
,这将为您提供一组未经编辑的字母。它肯定会节省几行代码。如:
$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__
答案 2 :(得分:1)
你的foreach循环是一个很好的方法。它不会很慢,因为你的话永远不会很大。
您还可以创建带有猜测字母的正则表达式模式,以替换除这些字母之外的所有内容。像这样:
$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/'; // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
答案 3 :(得分: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