【问题标题】:hangman "word" in phpphp中的刽子手“词”
【发布时间】:2010-01-13 14:22:47
【问题描述】:

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

【问题讨论】:

  • PHP中是否存在正则表达式?如果是这样,您可以替换所有出现或 . (可以是任何字符)带有 _。在 Perl 中,它会像 thist 一样:s/./_/g

标签: php str-replace strsplit


【解决方案1】:

如果我没听错,你想做与第一行相反的事情:

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】:

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

    你想使用一个数组,因为你可以很容易地分辨出数组中的哪些索引是包含字母的索引,这与字符串中的哪个位置应该成为字母直接相关。

    【讨论】:

    • 那么您推荐什么作为解决方案?
    【解决方案3】:

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

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

    $word = 'ball';
    $lettersGuessed = array('b','a');
    $pattern = '/[^' . implode('', $lettersGuessed) . ']/';   // results in '/[^ba]/
    $maskedWord = preg_replace($pattern, '_', $word);
    echo $maskedWord;
    

    【讨论】:

      【解决方案4】:

      另一种方法是将字符串作为数组访问,例如

      $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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多