PHP Fungsi Acak Kalimat Berputar

Dalam artikel ini saya menyajikan solusi saya untuk pengembang PHP wawancara untuk tugas kerja yang sangat umum di mana diperlukan untuk membuat fungsi kalimat berputar secara acak. Masukan dari fungsi ini adalah string PHP yang menggunakan sintaks kode kita di mana keacakan dan apa substring mungkin untuk setiap bagian dari keacakan.Pada dasarnya diperlukan untuk membuat kode PHP yang dapat memproses string seperti berikut:
<?php
$string = '{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}';

?>

Seperti Anda mungkin bisa menebak kalimat masukan menggunakan kawat gigi untuk menyatakan bagian dari keacakan dan karakter pipa untuk membatasi substring yang harus digunakan secara acak di dalam bagiannya. Kode juga harus dapat memproses bagian bersarang keacakan.
Outputnya harus kalimat acak seperti salah satu dari berikut:
Please make this awesome test sentence rotate fast and random
Please make this cool test sentence spin and be random
Just make this cool test sentence rotate quickly and random
Just make this awesome test sentence spin and be random
Saya telah melihat beberapa orang mencoba untuk menggunakan ekspresi reguler untuk menangani hal ini, tapi karena kita perlu untuk mendukung bagian bersarang keacakan fungsi rekursif adalah taruhan terbaik saya. Jadi, inilah PHP acak fungsi kalimat berputar dan kode pengujiannya :
<?php
/**
 * Recursive function for parsing and randomizing
 * given sentence.
 * @author Marko Martinović
 *
 * @param string $sentence Given sentence
 * @return string Random sentence
 */
function randomizer($sentence){
    $rand_sentence = '';

    // Split sentence into characters
    $char_array = str_split($sentence);

    // Open braces counter
    $br_count = 0;

    // Opening left brace offset
    $br_start = 0;

    // Iterate over characters
    foreach ($char_array as $key => $char) {
        switch ($char){

            // Is it left brace?
            case '{':
                // Is it opening brace?
                if($br_count == 0){
                    // If it is note the offset
                    $br_start = $key;
                }

                // Increment open braces counter
                $br_count++;
                break;

                // Is it right brace?
            case '}':
                // Decrement open braces counter
                $br_count--;

                // Is it closing brace?
                if($br_count == 0) {
                    /* Call randomizer again to detect nested
                     * braces in the current section. Randomizer
                     * returns current section but without any
                     * nested braces so we can proceed with
                     * exploding it using | character */
                    $rands = explode(
                        '|',
                        randomizer(
                            implode(
                                '',
                                array_slice(
                                    $char_array,
                                    $br_start + 1,
                                    $key - $br_start - 1
                                )
                            )
                        )
                    );

                    /* Store random element of current section's
                     * | exploded array */
                    $rand_sentence .= $rands[array_rand($rands)];
                }
                break;

                // Is it any other character?
            default:
                /* Since | is only inside {} delimited section,
                 * if there aren't any open braces we can just store
                 * other chracters. */

                if($br_count == 0){
                    $rand_sentence .= $char;
                }
        }
    }

    return $rand_sentence;
}

$string = '{Please|Just} make this {cool|awesome|random} test sentence {rotate {quickly|fast} and random|spin and be random}';

echo randomizer($string);

?>

Seperti yang Anda lihat saya memproses karakter string input dengan karakter menyimpan bagian statis dari string dan mendeteksi kawat gigi dipisahkan bagian menggunakan counter sederhana. Untuk setiap bagian dari keacakan saya rekursif memanggil fungsi untuk melakukan pekerjaan itu memperlakukan setiap bagian sebagai kalimat sendiri. Aku tidak akan masuk ke sisa kode karena itu harus jelas.
Previous
Next Post »