LoginSignup
8
3

More than 3 years have passed since last update.

PHPで「大石・泉・すき」をランダムに表示して「大石泉すき」が完成したら大石泉すき

Last updated at Posted at 2019-12-22

この記事について

本記事は、「大石泉すき」 Advent Calendar 2019の23日目です。

プログラム言語「PHP(PHP: Hypertext Preprocessor)」を使い、「大石泉すき」が完成するまで「大石・泉・すき」をランダム表示するプログラムを作成します。

大石泉とは

「大石泉」(おおいし いずみ)とは、Mobageにて配信されているバンダイナムコエンターテインメントのソーシャルゲーム『アイドルマスター シンデレラガールズ』に登場するロジックアイドルである。

(引用:ニコニコ大百科より)

私の担当アイドルである二宮飛鳥とは出身地が同じ(静岡県)で歳が近いということでいつか公式でユニット組んでくれないかなーと思ってるんですが、中々その機会が訪れなくて泣けますね。

PHPで「大石泉すき」を表示するには

まず最初に、PHPで「大石泉すき」と単純に表示するだけのプログラムを作る場合について考えます。
PHPでは以下のように記述することで、「大石泉すき」と表示することができます。

大石泉すき

冗談抜きでこれで終わりです。
PHPは、以下のようにHTMLの中に埋め込んで使うことができる言語です。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?php echo $title; ?></title>
</head>
<body>
    <?php
        // <?php ~ ?> で囲った部分のみがPHPの記述として解釈される
        echo $content;
    ?>
</body>
</html>

この場合、「<?php ~ ?>」で囲われていない部分はHTMLとして普通に表示されます。
なので、一番最初の例のように単純に文字列を表示したい場合、PHPのタグを記述せず表示したい文字列を書けばそれで終わりなのです。
ね、簡単でしょう?

勿論、以下のようにプログラムっぽく書くことも可能です。

<?php
    echo '大石泉すき';

これで終わるとあまりにもあっさりしすぎなので、ちょっと捻ったことをやってみましょう。

#「大石泉すき」が完成するまで「大石・泉・すき」をランダム表示する #って何?

「大石泉すき」が完成するまで「大石・泉・すき」をランダム表示します。

何年か前に流行った「「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくる」を「大石泉すき」でやろうという試みです。

これをPHPで書くと、こんな感じです。

<?php
// 「大石泉すき」を少しずつ区切って配列に格納する
// 「大石泉すき」以外の文字列が紛れ込んでるって? さあ、何の事ですかね…………
$ooishiizumisuki = [
    '大石',
    '泉',
    '二宮',
    '飛鳥',
    'すき',
];

// 探索対象の文字列リスト
$search_list = [
    '大石泉すき',
    '二宮飛鳥すき',
];

// count関数は配列の要素数を取得する
// そこから1を引くことで当該配列における最大の添字を求めることができる
$max_index = count($ooishiizumisuki) - 1;

// PHPの配列は添字が0から始まる
$min_index = 0;

$text = '';
$appeared_text = '';

while (1) {
    // $ooishiizumisukiの中からランダムに文字列を取得して、文字列結合していく
    $index = random_int($min_index, $max_index);
    $text .= $ooishiizumisuki[$index];

    foreach ($search_list as $search_text) {
        // 結合した文字列の中に、探索対象の文字列が含まれていたらループを抜ける
        if (strpos($text, $search_text) !== false) {
            $appeared_text = $search_text;
            break 2;
        }
    }

}

// 探索対象の文字列が出現するまでに何文字を要したかを記録
$text_length = mb_strlen($text);

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?=$appeared_text;?></title>
</head>
<body>
    <div><?=$text;?></div>
    <div><?=$text_length;?>文字で「<?=$appeared_text;?>」が出現しました。<?=$appeared_text;?></div>
</body>
</html>

実際に実行すると、こんな感じになります。

すき二宮泉すきすき大石すき飛鳥すき飛鳥泉すき泉大石大石飛鳥飛鳥泉飛鳥すきすき二宮泉飛鳥すき飛鳥泉飛鳥二宮大石二宮大石泉すき
61文字で「大石泉すき」が出現しました。大石泉すき

運がよければ以下のように最短で「大石泉すき」できます。

大石泉すき
5文字で「大石泉すき」が出現しました。大石泉すき

ところで「大石飛鳥」、「二宮泉」ってすごくときめく文字列じゃありませんか?
バンナ○ならびにサイゲ○ムスはいずあすを公式化してね! しろよ☆

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3