Henker „Wort“ in php
-
20-09-2019 - |
Frage
Ich versuche, etwas ähnliches zu Henker zu tun, wo, wenn Sie einen Brief erraten, es einen Unterstrich ersetzt, was der Brief ist. Ich habe kommen mit einem Weg nach oben, aber es scheint sehr ineffizient und ich frage mich, ob es einen besseren Weg gibt. Hier ist, was ich habe -
<?
$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
tut das Gegenteil von dem, was ich will. Ich will, was der Wert von $finalWord
ist ohne durch eine Schleife zu gehen um das Ergebnis zu erhalten, ich wünsche.
Lösung
Wenn ich Ihnen folgendes Recht wollen Sie das Gegenteil von der ersten Zeile tun:
echo str_replace( $lettersGuessed , '_' , $word ); // __ll
Warum nicht eine Reihe von $opposite = range('a', 'z');
erstellen und verwenden Sie dann array_diff ()
gegen $ lettersGuessed, mit dem Sie eine Reihe von Buchstaben ungeahnte geben. Es wäre sicherlich ein paar Zeilen Code speichern. Wie zum Beispiel:
$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__
Andere Tipps
Es ist ein Array, foreach ist, was Sie suppose, schnell es den Blitz zu tun sowieso, ich glaube, Sie etwas besessen, die nicht einmal ein Problem.
Sie möchten ein Array verwenden, weil Sie leicht die, welche Indizes im Array sind diejenigen, die den Buchstaben enthalten, die direkt korreliert mit dem Platz in der Kette sagen kann _ sollte ein Brief werden.
Ihre foreach-Schleife ist eine feine Weise, es zu tun. Es wird nicht langsam sein, weil deine Worte nie sehr groß sein werden.
Sie können auch einen RegexMuster mit den Buchstaben erraten schaffen alles außer diesen Buchstaben zu ersetzen. Wie folgt aus:
$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/'; // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;
Eine andere Möglichkeit, die Zeichenfolge als Array zuzugreifen wäre, z.
$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