平凡エンジニアによる平凡ブログ

平凡インフラエンジニアがスキルアップを目指してプログラミングやクラウドやサーバといったインフラのアウトプットをしていきます!

【PHP】標準入力した値を配列に入力して、ランダムに出力させよう!

今回のテーマ

PHPで標準入力した値を配列に代入して、その値をランダムで出力させるプログラムを書きます。

今回は例としてRPG風に10,20,50のダメージを与えたことを出力するプログラムにしてみます。

サンプルコード

まずはコードを実際に書いてみます。 入力値は10 20 50です。

<?php
while($input =fgets(STDIN)){
    $array[] =trim($input);
}
$max =count($array)-1;
$attack =rand(0,$max);
echo "敵に与えたダメージは".$array[$attack];

?>
// 出力値
敵に与えたダメージは10
※ランダムで20、50も出力

解説

複雑なので、部分ごとに何をしているコードなのか説明します。

①標準入力された値を配列$arrayに格納する。
while($input =fgets(STDIN)){
    $array[] =trim($input);
}

whileの条件分岐に標準入力を$inputに入れる構文を記載します。
この記載によって標準入力があればwhile文の中の処理を繰り返すという
文になります。

その中の処理が$inputを$arrayという配列に格納するという処理です。

※補足
trimは文頭や文末のスペースを取り除く関数です。
スペースがあれば、配列の要素が空白で登録されてしまう恐れがあるので その可能性を防ぐために念のためつけてます。

trimのレファレンス
https://www.php.net/manual/ja/function.trim.php

②配列の要素数を変数に代入する
$max =count($array)-1;

count関数で$arrayの数を取得しています。 この例では3が代入しております。 ただしこの後の処理のためにそこから-1しているので $maxに入るのは2になります。 -1している理由は後に説明する。

③rand関数で配列の数だけランダムで出力できるように変数に代入

$attack =rand(0,$max);

rand関数はランダムで数値を出力(乱数を出力) 例えばrand(0,3)とすれば0,1,2,3どれかの数値が出力されます。

ここでは②で取得した$maxを乱数の最大値として設定しました。 これでもし標準入力が増えても修正が必要なく実行できるようになります。

②で配列要素数から-1した理由 さてここで②でcount-1した理由になりますが 今回の例だと10 20 50の3要素を配列に格納するため$maxは3になります。

しかし$arrayの配列の要素は以下の通り[0][1][2]になり、この後配列[$attack]とした際に 乱数によっては[3]の配列が出力される恐れが出てきます。
それを防ぐために要素数から-1する必要があったのです。

Array (
[0] => 10
[1] => 20
[2] => 50
)

④乱数の数値を要素No(インデックス)に入れて配列の値を出力させる
echo "敵に与えたダメージは".$array[$attack];

最後は出力です。
③で取得した乱数(0or1or2)を配列のインデックスに入力して 配列の要素をランダムで出力させます。
$array[0]→10
$array[1]→20
$array[2]→50

まとめ

以上です。 複雑ですが、理解できるようになれば
これだけいろんな処理をつくれます。

もともとこの処理を学んだページではおみくじを例にしてました。
(1がでれば大吉、2がでれば小吉にするっといった感じ)
まずは一つ一つの処理を理解していきたいです。

PHPフレームワーク Laravel入門 第2版

PHPフレームワーク Laravel入門 第2版