0

我正在尝试做类似于 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是什么,而不必通过循环来获得我想要的结果。

4

4 回答 4

2

这是一个数组,foreach 是您应该做的,无论如何它都快如闪电,我认为您正在痴迷于甚至不是问题的事情。

您想使用数组,因为您可以轻松地判断数组中的哪些索引是包含字母的索引,这与字符串中的哪个位置 _ 应该成为字母直接相关。

于 2010-01-13T14:27:11.837 回答
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__
于 2010-01-13T14:31:18.783 回答
1

你的 foreach 循环是一个很好的方法。它不会很慢,因为你的话永远不会很大。

您还可以使用猜测的字母创建正则表达式模式来替换除这些字母之外的所有内容。像这样:

$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/';   // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
于 2010-01-13T14:35:16.953 回答
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
于 2010-01-13T14:36:47.183 回答