2010-01-13 58 views
0

我試圖做類似的劊子手一些地方,當你猜的信,它取代下劃線的字母是什麼。我想出了一個辦法,但它似乎效率很低,我想知道是否有更好的方法。這是我有 -劊子手「字」在PHP

<? 
$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

是否正則表達式中存在PHP?如果是這樣,你可以取代所有的發生或。 (這是任何字符)與_。 在Perl中,它會像thist:s /./_/ g – 2010-01-13 14:36:23

回答

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__ 
2

它是一個數組,是的foreach你想在做什麼,這是快如閃電反正,我想你是沉迷在一些甚至不是一個問題。

你想用你監守數組可以很容易地分辨出哪數組中的索引是包含字母,這直接關聯到_應該成爲哪個地方串在信的人。

+0

那麼您推薦什麼解決方案? – scott 2010-01-13 14:36:10

1

你的foreach循環是一個很好的方法來做到這一點。它不會很慢,因爲你的話永遠不會很大。

您也可以創建一個猜字母一個正則表達式來替換除了這些信件的一切。像這樣:

$word = 'ball'; 
$lettersGuessed = array('b','a'); 
$pattern = '/[^' . implode('', $lettersGuessed) . ']/'; // results in '/[^ba]/ 
$maskedWord = preg_replace($pattern, '_', $word); 
echo $maskedWord; 
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