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