문제

나는 당신이 편지를 추측 할 때 밑줄을 편지의 내용으로 대체하는 행맨과 비슷한 일을하려고합니다. 나는 방법을 생각해 냈지만 매우 비효율적 인 것처럼 보이며 더 나은 방법이 있는지 궁금합니다. 여기 내가 가진 것 -

<?
$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 내가 원하는 것과 반대입니다. 나는 가치를 원한다 $finalWord 내가 원하는 결과를 얻기 위해 루프를 통과 할 필요가 없습니다.

도움이 되었습니까?

해결책

내가 당신을 올바르게 따르고 있다면 당신은 첫 번째 줄의 반대를하고 싶습니다.

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

배열을 만들지 않겠습니까? $opposite = range('a', 'z'); 그리고 사용하십시오 array_diff () $ lettersguessed에 대해, 당신은 당신에게 당신에게 많은 무의미한 편지를 줄 것입니다. 확실히 몇 줄의 코드를 절약 할 것입니다. 와 같은:

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

다른 팁

그것은 배열입니다. foreach는 당신이하고 있다고 생각하는 것입니다. 어쨌든 번개가 빨라졌습니다. 나는 당신이 문제조차하지 않는 것에 대해 집착하고 있다고 생각합니다.

배열에서 어레이를 사용하려면 배열의 어떤 인덱스가 문자를 포함하는 인덱스인지 쉽게 알 수 있습니다.

당신의 foreach 루프는 그것을하는 좋은 방법입니다. 당신의 말이 결코 크지 않기 때문에 느리지 않을 것입니다.

또한 그 글자를 제외한 모든 것을 대체하기 위해 추측 된 문자로 Regex 패턴을 만들 수도 있습니다. 이와 같이:

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

또 다른 방법은 배열로 문자열에 액세스하는 것입니다.

$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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top