【PHP】標準入力 - プログラムの実行中にコマンドラインから値を入力する / fgets(STDIN)

【PHP】標準入力 - プログラムの実行中にコマンドラインから値を入力する / fgets(STDIN)

プログラムで扱う値を外部から入力するには標準入力を使用します。

入力元にはキーボードやファイルなどがあり、それらの入力値を使った処理にすることで、汎用性のあるプログラムを作成できます。

ここでは、標準入力について解説します。

検証環境

標準入力

標準入力はプログラムで扱う値の入力元のことです。

入力元にはキーボードやファイルなどがあり、プログラムは処理の中で標準入力の値を受け取ることができます。

プログラムの実行ごとに扱う値を変えたい場合は、値をソースコードに記述せずに、標準入力の値を使うようにすることで、汎用性高いプログラムの作成が可能です。

本ドキュメントではキーボードの標準入力について、実装方法をサンプル付きで解説します。

解説の際に関数を使用しますが、関数について未学習の方は記法と役割のみ覚えていただければ問題ありません。

キーボード入力

コマンドラインで実行したプログラムに、キーボードから値を入力することができます。

基本構文

fgets(STDIN)

fgetsは標準入力の値を受け取る関数です。

丸括弧(())内に入力元を指定し、キーボード入力の場合はSTDINとします。

サンプル

<?php

echo "[ please input ]\n";
___ih_hl_start
$input = fgets(STDIN);
___ih_hl_end

echo "[ input value ]\n";
echo $input;

?>

4行目のfgets(STDIN)がキーボード入力の受け取りです。

fgets(STDIN)は入力を受け取るまで、次の処理に進まずに待機します。

$ php sample1.php
[ please input ]
 

ここではHello World!をキーボードで入力し、Enterキーを押します。

$ php sample1.php
[ please input ]
___ih_hl_start
Hello World!
___ih_hl_end
[ input value ]
Hello World!

fgets(STDIN)Hello World!という値を受け取って待機を終了します。

その後、通常通りプログラムは、後に続く処理を実行するため、実行結果のような出力になります。

改行の削除

fgets(STDIN)の入力値は改行コードを含みます。

そのため、次のように入力値をそのまま出力すると、途中で改行されます。

<?php

echo "[ please input ]\n";
$input = fgets(STDIN);

echo "[ input value ]\n";
echo "--- ".$input." ---";

?>
$ php sample2.php
[ please input ]
Hello World!
[ input value ]
___ih_hl_start
--- Hello World!
___ih_hl_end
 ---

実行結果の5行目、Hello World!後の改行は入力値に改行が含まれることを表しています。

しかし、プログラムの処理では、“改行コードを含まない値”として扱いたいケースが多くあります。

その場合はtrim関数を使用して入力値を加工します。

trim(値)

trim関数は丸括弧内の値について、前後の空白文字や改行コードを削除した値を取得します。

<?php

echo "[ please input ]\n";
$input = fgets(STDIN);
___ih_diff_start
+$value = trim($input);
___ih_diff_end

echo "[ input value ]\n";
___ih_diff_start
-echo "--- ".$input." ---";
+echo "--- ".$value." ---";
___ih_diff_end

?>
$ php sample2.php
[ please input ]
Hello World!
[ input value ]
--- Hello World! ---

5行目でtrim関数で加工した値を$valueに代入し、8行目で$valueを出力するように変更しました。

実行結果の5行目が途中で改行されていないことから分かるように、$valueには改行コードを含まない値が記憶されています。

複数回入力

複数回入力する場合は、反復処理であるfor文やwhile文を使用します。

特にwhile文は入力値を使った終了判定をシンプルに実装できるため相性が良いです。

例えば、exitが入力されるまで、入力を複数回行なうプログラムは次のようになります。

<?php

$input = '';

while( $input != 'exit' ) {
    echo "[ please input ]\n";
    $input = trim(fgets(STDIN));
 
    echo "[ input value ]\n";
    echo $input."\n";
}

echo "[ exit ]";

?>
$ php sample3.php
[ please input ]
Hello World!
[ input value ]
Hello World!
[ please input ]
Good Morning!
[ input value ]
Good Morning!
[ please input ]
Technology
[ input value ]
Technology
[ please input ]
exit
[ input value ]
exit
[ exit ]

ポイントはwhile文の条件式に入力値を記憶する$inputを使用することです。

そうすることにより、特定の入力値(ここではexit)が入力されるまで繰り返し処理を実行します。

演習問題

問題1

金額(税込)を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 金額(税込)は『金額(税抜)+ 金額(税抜)× 消費税率』で計算する
  • 金額(税抜)は標準入力で入力する
  • 消費税率は10%とする。
$ php practice.php
--- 金額(税抜)を入力してください。
> 1500
--- 金額(税込)は1650円です。
$ php practice.php
--- 金額(税抜)を入力してください。
> 36000
--- 金額(税込)は39600円です。

問題2

料金を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 料金は『単価 × 個数』で計算する
  • 単価と個数は標準入力で入力する
$ php practice.php
--- 単価を入力してください。
> 1200
--- 個数を入力してください。
> 7
--- 料金は8400円です。
$ php practice.php
--- 単価を入力してください。
> 1230
--- 個数を入力してください。
> 123
--- 料金は151290円です。

問題3

複数の数値の合計値を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 数値は標準入力で0が入力されるまで受け取る
$ php practice.php
--- please input ---
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> 9
> 0
total : 45
$ php practice.php
--- please input ---
> 11
> 22
> 33
> 44
> 55
> 66
> 77
> 88
> 99
> 0
total : 495