Domanda

che sto cercando di fare qualcosa di simile al boia dove quando si indovina una lettera, sostituisce una sottolineatura con ciò che la lettera è. Sono venuto con un modo, ma sembra molto inefficiente e mi chiedo se c'è un modo migliore. Ecco quello che ho -

<?
$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 fa il contrario di ciò che voglio. Voglio quale sia il valore di $finalWord è senza dover passare attraverso un ciclo per ottenere il risultato che desidero.

È stato utile?

Soluzione

Se io sto seguendo il tasto destro si vuole fare il contrario della prima linea:

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

Perché non creare un array di $opposite = range('a', 'z'); e quindi utilizzare array_diff () contro $ lettersGuessed, che vi darà una serie di lettere unguessed. Sarebbe certamente salvare un paio di righe di codice. Come ad esempio:

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

Altri suggerimenti

E 'un array, foreach è quello che stai supponiamo di fare, è un fulmine veloce in ogni modo, penso che tu sia ossessionato da qualcosa che non è nemmeno un problema.

Si desidera utilizzare una matrice becuase si può facilmente dire che gli indici nella matrice sono quelli che contengono la lettera, che è correlato direttamente alla quale posto nella stringa del _ dovrebbe diventare una lettera.

Il ciclo foreach è un ottimo modo per farlo. Non sarà lento perché le sue parole non saranno mai essere enorme.

È anche possibile creare un modello di espressione regolare con le lettere indovinate per sostituire tutto, tranne quelle lettere. In questo modo:

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

Un altro modo sarebbe quello di accedere alla stringa come una matrice, per esempio.

$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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top