سؤال

وأنا أحاول أن تفعل شيئا من هذا القبيل إلى الجلاد حيث عند تخمين بريد إلكتروني، فإنه يستبدل تسطير مع ما هو حرف. لدي التوصل إلى وسيلة، ولكن يبدو غير فعالة للغاية وأنا أتساءل إذا كان هناك طريقة أفضل. هنا هو ما قلته -

<?
$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، والتي سوف تعطيك مجموعة من الرسائل unguessed. بالتأكيد ان يوفر بضعة أسطر من التعليمات البرمجية. مثل:

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

نصائح أخرى

وانها صفيف، foreach هو ما كنت افترض أن تفعل، انها بسرعة البرق على أي حال، أعتقد أنك التوجس على شيء ولا حتى مشكلة.

وتحتاج إلى استخدام مجموعة بيكوس يمكن أن أقول لكم بسهولة التي الفهارس في مجموعة هي تلك التي تحتوي على الحرف، والذي يرتبط مباشرة إلى أي مكان في السلسلة _ ينبغي أن تصبح الرسالة.

وحلقة foreach الخاص بك هو وسيلة غرامة للقيام بذلك. فإنه لن يكون بطيئا بسبب كلامك لن تكون ضخمة.

ويمكنك أيضا إنشاء نمط التعابير المنطقية مع رسائل خمنت ليحل محل كل شيء ما عدا تلك الرسائل. مثل هذا:

$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