57
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP Paiza 標準入力テンプレート

Last updated at Posted at 2020-08-15

Paiza

Paizaはコーディングのスキルチェックが行えます。
問題では標準入力からパラメータを受け取りますが、毎回書くのも手間なのでどの問題でも共通して利用できるテンプレートを用意しました。

Paiza標準入力テンプレート

単一行でも複数行でもDランク〜SランクまですべてのPaizaの問題で利用できます。また、ローカルで動作確認のやり方もご紹介します。

example.php
<?php

$inputs = [];
while ($input = trim((string) fgets(STDIN))) {
    $inputs[] = explode(' ', $input);
}

var_dump($inputs);

使い方1

$ php example.php

ScreenShot 2022-08-17 10.37.40.png

ファイルを実行すると標準入力を受け付けます。
空Enterするとループから抜けます。

入力したデータは $inputs に配列で格納されてるので良い感じに使用してください。

使い方2

何度も動作確認したい時に標準入力を何度も行うのは手間がかかります。
何行にも渡りも入力データがある場合は入力ミスも発生しやすいです。

実行時にファイルを標準入力にリダイレクトすると簡単です。

stdin.txt
aaa bbb ccc
100 200 300 400 500

stdin.txt はただのテキストファイルです。

$ php example.php < stdin.txt

ScreenShot 2022-08-17 10.58.02.png

Dockerコマンド

$ docker run -i -v $(pwd):/data -w /data php:8.1 php example.php < stdin.txt

ローカルにphp環境作るのが面倒な人はdockerでphpコンテナを作るのが一番楽かなと思います。

標準出力テスト

$ diff <(docker run -i -v $(pwd):/data -w /data php:8.1 php c075.php < stdin.txt) <(cat stdout.txt)

標準出力が多い場合、1行1行目で確認するのは手間なので、diffで差分がないか確認すると良いです。

解説

STDIN

STDINstandard input(標準入力) の意味です。
ターミナルで入力した文字を標準入力としてPHPへ渡す形になります。

fgets とは

第一引数に指定したファイルポインタから1行取得し、その文字列を返します。
https://www.php.net/manual/ja/function.fgets.php
STDIN という標準入力を表す定数を渡しているので、標準入力から1行取得します。
fgets した時に読み込みデータがない場合、 false が返るので string にキャストしてます。

trim とは

第一引数に指定した文字列の先頭および末尾にある空白や改行を取り除き、その文字列を返します。
https://www.php.net/manual/ja/function.trim.php

改行のみの行を最終行と判定したいのですが、改行コードがあるとループから抜けることができないので、trimしてます。

参考記事

57
58
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
57
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?