「標準入力」は、プログラム言語を勉強し始めている段階の人だと出くわすことは少ないですが、競技プログラミングやアルゴリズム・プログラミングスキルテストなどでしばし使われます。
慣れると特に難しい概念ではありませんが、私は勉強をはじめたばかりの頃に少し手こずったので、普段使っている標準入力の扱い方をメモしました。
標準入力を使った例
標準入力の仕組みを使うと、外部から与えられた入力値を受け取ることができます。例えば、echoを使って文字列を出力する際の違いです。
echo "こんにちは"; //出力:こんにちは
$word = "こんにちは";
echo $word; //出力:こんにちは
$word = fgets(STDIN);
echo $word; //出力:fgets(STDIN)の内容
//慣れたらまとめて書くと綺麗です。
echo fgets(STDIN); //出力:fgets(STDIN)の内容
プログラミングスキルテストなどは、自動でfgets(STDIN)に値が入れられてプログラムが動く仕組みになっているものもありますが、
LinuxなどのOSでphpファイルを出力する場合は、自分で任意の文字を入れて動かすことができます。
Linuxで出力する場合
例えば下記内容を書いたindex.phpファイルを作ります。echo fgets(STDIN);
それをLinuxで出力します。
phpファイルを出力したいときは、$(プロンプト)の後にphpを書いてからファイル名を指定します。
//Linux画面
$ php index.php
Enterキーを押すと出力が開始されますが、
fgets(STDIN)を使っている場合は、
fgets(STDIN)に入れる値を自分で入力するまでプログラムは動きません。
//Linux画面
例1
$ php index.php
おはよう //任意の入力値を自分で入れる
//出力:おはよう
例2
$ php index.php
こんばんは //任意の入力値を自分で入れる
//出力:こんばんは
標準入力の扱い方
標準入力の仕組みでは、1つの文字列を例としていましたが、 標準入力で与えられる入力値はさまざまな形式があります。前後に空白がある文字列が与えられる場合
与えられた複数の文字列の前後に空白がある場合は、前後の空白も配列に取り込んでしまいます。 この様な場合は、trim関数を使うと前後の空白をなくしてくれます。trim関数の詳しい文法は公式PHP文法サイトよりご確認ください。
Google検索
//例 fgets(STDIN)に与えられる文字:A(後ろに空白がある)
$array = trim(fgets(STDIN));
echo $array[0]; //出力:A(後ろに空白なし)
(配列編)半角スペースで区切られた2つ以上の文字列(前後の空白なし)が与えられる場合
半角スペースで区切られた2つ以上の文字列が与えられる場合は、 与えられた文字列をまず配列に入れておくと扱いやすいです。 使う関数はexplodeで、今回は「" "」(空白)で区切れられているところで分けながら 配列に入れています。explode関数の詳しい文法は公式PHP文法サイトよりご確認ください。
Google検索
//例 fgets(STDIN)に与えられる文字:A B C
$array = explode(" ", fgets(STDIN));
//$array = [A,B,C]←配列に格納される
echo $array[0]; //出力:A
空白以外の区切り方でfgets(STDIN)を受け取ったとしても、explode関数の「" "」部分を変更すれば解決できます。
(list編)半角スペースで区切られた2つ以上の文字列(前後の空白なし)が与えられる場合
fgets(STDIN)で与えられた入力値を配列に入れる他に、 与えられる文字列の数が少数だと直接変数に値を移す方法もあります。 list関数を使います。list関数の詳しい文法は公式PHP文法サイトよりご確認ください。
Google検索
//例 fgets(STDIN)に与えられる文字:A B C
list($a, $b, $c) = explode(" ", fgets(STDIN));
echo $a; //出力:A
echo $b; //出力:B
echo $c; //出力:C
半角スペースで区切られた2つ以上の文字列(前後には空白あり)が与えられる場合
さまざまな要素が複合的になっても、関数を組み合わせれば解決できます。 explode関数とtrim関数やlist関数とtrim関数などは合わせて使うことが多いです。//例 fgets(STDIN)に与えられる文字:A B C(空白)
//配列の場合
$array = explode(" ", trim(fgets(STDIN)));
//$array = [A,B,C]←配列に格納される
echo $array[0]; //出力:A
//listの場合
list($a, $b) = explode(" ", trim(fgets(STDIN)));
echo $a; //出力:A
echo $b; //出力:B
echo $c; //出力:C
初学者さんの参考になれば嬉しいです。