Question

Je suis en train de faire quelque chose de similaire à Hangman où lorsque vous devinez une lettre, il remplace un trait de soulignement à ce que la lettre est. Je suis venu avec une certaine façon, mais il semble très inefficace et je me demande s'il y a une meilleure façon. Voici ce que j'ai -

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

Était-ce utile?

La solution

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 une série de lettres unguessed. Il serait certainement sauver quelques lignes de code. Tels que:

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

Autres conseils

Il est un tableau, foreach est ce que vous êtes supposé être faire, il est rapide comme l'éclair de toute façon, je pense que vous obnubiler sur quelque chose qui est même pas un problème.

Vous voulez utiliser un tableau becuase vous pouvez facilement dire quels index dans le tableau sont celles qui contiennent la lettre, ce qui est directement lié à quel endroit dans la chaîne du _ devrait devenir une lettre.

Votre boucle foreach est une bonne façon de le faire. Il ne sera pas lent parce que vos mots ne seront jamais énorme.

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

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

Une autre façon serait d'accéder à la chaîne comme un tableau, par exemple.

$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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top