2010-01-13 6 views
0

J'essaie de faire quelque chose de similaire à bourreau où lorsque vous devinez une lettre, il remplace un trait de soulignement par ce que la lettre est. J'ai trouvé un moyen, mais cela semble très inefficace et je me demande s'il y a un meilleur moyen. Voici ce que j'ai -bourreau "mot" en 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 fait le contraire de ce que je veux. Je veux ce que la valeur de $finalWord est sans avoir à passer par une boucle pour obtenir le résultat que je désire.

+0

Existe-t-il des expressions régulières en PHP? Si oui, vous pouvez remplacer toute occurrence ou. (qui est n'importe quel caractère) avec un _. En Perl, il irait comme thist: s /./_/ g –

Répondre

2

Si je vous suis bien, vous voulez faire le contraire de la première ligne:

echo str_replace($lettersGuessed , '_' , $word); // __ll 

Pourquoi ne pas créer un tableau de $opposite = range('a', 'z'); puis utilisez array_diff() contre $ lettersGuessed, qui vous donnera un tableau de lettres non-averties. Cela permettrait certainement d'économiser quelques lignes de code. Tels que:

$all_letters = range('a', 'z'); 
$unguessed = array_diff ($all_letters, $lettersGuessed); 
echo str_replace($unguessed , '_' , $word); // ba__ 
2

C'est un tableau, car c'est ce que vous êtes censé faire, c'est rapide comme l'éclair, je pense que vous êtes obsédé par quelque chose qui n'est même pas un problème.

Vous voulez utiliser un tableau parce que vous pouvez facilement dire quels index dans le tableau sont ceux qui contiennent la lettre, ce qui corrèle directement à quel endroit de la chaîne le _ devrait devenir une lettre.

+0

alors que recommandez-vous comme solution? – scott

1

Votre boucle foreach est un excellent moyen de le faire. Ce ne sera pas lent car vos mots ne seront jamais énormes.

Vous pouvez également créer un motif regex avec les lettres devinées pour remplacer tout sauf ces lettres. Comme ceci:

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

Une autre manière serait d'accéder à la chaîne sous la forme d'un tableau, par ex.

$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