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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top