ダッシュで奪取

レガシーSIer → webエンジニア(見習い) 新しく知ったことのメモを書いています。

【PHP】標準入力の値の受け取り方あれこれ

競技プログラミングの問題を解いて遊ぼうと思ったのですが、問題を解く以前に値の受け取り方で詰まってしまったのでメモです。

目次

  1. 標準入力が一行の場合
  2. 一行に複数の値がある場合
  3. 標準入力が複数行の場合
  4. 複数行に複数の値がある場合
  5. 参考サイト
  6. 今日の日記

1.標準入力が一行の場合

入力値

10
<?php
    $input_line = trim(fgets(STDIN));
    echo $input_line;
?>

出力結果

10

fgets(STDIN)・・・標準入力の読み込み
trim( $string )・・・ $stringの、先頭および末尾の空白・改行を除去

末尾に改行コードが入っている場合があるので、trimで綺麗な形にしておく必要があります。

2.一行に複数の値がある場合

1つずつ出力

入力値

10 9 8
<?php
    $input_line = trim(fgets(STDIN));
    $array      = explode(" ", $input_line);
    echo $array[0].PHP_EOL;
    echo $array[1].PHP_EOL;
    echo $array[2].PHP_EOL;
?>

出力結果

10
9
8

explode( $delimiter, $string )・・・$stringを、$delimiterの文字で区切った配列にして返す

この例だと、半角スペース(" ")で区切っています。

ループで出力

入力値

10 9 8
<?php
    $input_line = trim(fgets(STDIN));
    $array      = explode(" ", $input_line);
    for ( $i = 0; $i < count($array); $i++) {
        echo $array[$i].PHP_EOL;
    }
?>

出力結果

10
9
8

3.標準入力が複数行の場合

1つずつ出力

入力値

7
6
5
<?php
    $input_line = trim(fgets(STDIN));
    echo $input_line.PHP_EOL;

    $input_line = trim(fgets(STDIN));
    echo $input_line.PHP_EOL;

    $input_line = trim(fgets(STDIN));
    echo $input_line.PHP_EOL;
?>

出力結果

7
6
5

1回取得し直す度に、次の行が取れるみたいです。へぇ〜!ってなりました(これが分からなくてちょっと詰まりました)。

ループで出力

入力値

7
6
5
<?php
    while ( $input_line = fgets(STDIN) ) {
        echo trim($input_line).PHP_EOL;
    }
?>

出力結果

7
6
5

while( 式 )・・・式の値がTRUEである間、ループ処理

1回取得し直す度に次の行へいってくれるので、こういう書き方で良いんですね。なるほど…

何故whileの式の中でtrimしないのか

例の入力値の場合は問題ないのですが、標準入力値の中に「0」があると、while( 0 )で「偽」判定になってループを抜けてしまいました。
trimで空白・改行を除去しなければ「0+改行」の状態で取得できるので、「0」が来てもループを抜けることなく次の処理に進めます。

配列に入れてみる

入力値

7
0
5
<?php
    $array = [];
    while ( $input_line = fgets(STDIN) ) {
        $array[] = trim($input_line);
    }
    echo $array[0].PHP_EOL;
    echo $array[1].PHP_EOL;
    echo $array[2].PHP_EOL;
?>

出力結果

7
0
5

4.複数行に複数の値がある場合

入力値

8 7 6
2 1 0
<?php
    // $input_lineの行数分ループする
    while ( $input_line = fgets(STDIN) ) {
        // 半角スペースで区切って配列へ
        $array = explode(" ", trim($input_line));

        // 配列の中身を1つずつ出力
        for( $i = 0; $i < count($array); $i++) {
            echo $array[$i].PHP_EOL;
        }
    }
?>

出力結果

8
7
6
2
1
0

これまでの合わせ技で…

5.参考サイト

6.今日の日記

これだけあればpaizaのDランク問題は解けるのかなぁといったところです。後でちょっとやってみます。
今日は会社関係の書類を記入していたのですが、複数枚ある中全部住所が誤っていてちょっと笑ってしまいました。