在php中的刽子手“字”

时间:2010-01-13 14:22:48

标签: php str-replace strsplit

我正在尝试做一些类似于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 个答案:

答案 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