Pregunta

Estoy tratando de hacer algo similar a verdugo, donde cuando se adivina una carta, que reemplaza un guión con lo que la carta es. He llegado con una forma, pero parece muy ineficiente y estoy preguntando si hay una manera mejor. Aquí es lo que tengo -

<?
$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 hace lo contrario de lo que quiero. Quiero lo que el valor de $finalWord es sin tener que pasar por un bucle para obtener el resultado que deseo.

¿Fue útil?

Solución

Si estoy siguiendo su derecha que quiere hacer lo contrario de la primera línea:

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

¿Por qué no crear una matriz de $opposite = range('a', 'z'); y luego usar array_diff () contra $ lettersGuessed, que le dará una serie de letras ninguna noción. Sin duda, salvar unas pocas líneas de código. Tales como:

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

Otros consejos

Es una matriz, foreach es lo que estás supone que debe estar haciendo, que es la velocidad del rayo de todos modos, creo que está obsesionado con algo que ni siquiera es un problema.

¿Quieres utilizar una matriz becuase se puede decir fácilmente qué índices de la matriz son los que contienen la carta, que se correlaciona directamente con la cual lugar en la cadena de la _ debe convertirse en una carta.

Su bucle foreach es una buena manera de hacerlo. No va a ser lenta debido a que sus palabras nunca serán enormes.

También puede crear un patrón de expresión con las letras adivinadas para reemplazar todo excepto esas letras. De esta manera:

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

Otra forma sería acceder a la cadena como una matriz, por ejemplo.

$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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top