こんにちは!めっそそです。
今回は演算の基礎と基本三構造を扱いました。ひとまずこれでプログラミングの基礎編は終わりになります。
これで理論上は競技プログラミングにも参加できるようになったので、いつか挑戦してまた記事を書いてみようかなと。それは追々ですね。。
今回の学習内容
今回学んだことは以下のとおりです。
- 基本的な演算
- マジカルインクリメント
- 浮動小数点の計算
- 配列の加算
- 参照代入、分割代入
- 比較演算子、文字列の合成
- 条件分岐のif文、switch文、match文
- 反復処理のfor文、foreach文、while文
特徴のある機能は前回同様赤字で記載しています。正直なところ、条件分岐と反復処理は一瞬で終わるかなと思ったのですが意外と時間がかかりました。
概ね書き方は他のプログラミング言語と同じなのでかなりサクサク進められたのですが、match文なんかは学習した他のプログラミング言語にないので一から学習となったのが原因ですかね。
今回の所要時間:
演算の基礎…1時間
条件分岐・反復処理…1時間
学習メモ
演算の結果がPHPのバージョン(7.4以前と8.0以降)でかなり異なるため、今回は8.0以降をベースに学習しました。Pythonも2と3でかなり挙動が変わりますが、この大きな変化は影響が大きいので押さえておいた方がいいですね。(とはいえ7.4以前の挙動は参考書がないと分かりませんが。。)
これから新規にPHPの8.0以降を勉強するのであれば、数値と「先頭が数字になっている文字列」の計算だけに気をつければそんなに変な挙動はありません。
注意をしなければいけないのが、浮動小数点の計算ですね。ここは整数値の計算と同様の演算をすると誤差が生じるので、「bc〇〇(値1, 値2, 小数点以下の桁数)」の関数を用いる必要があります。
<?php
$num1 = 1.5;
$num2 = 0.2;
//和の計算(1.7)
$sum = bcadd($num1, $num2, 1);
//差の計算(1.3)
$sub = bcsub($num1, $num2, 1);
//積の計算(0.3)
$mul = bcmul($num1, $num2, 1);
//商の計算(7.5)
$div = bcdiv($num1, $num2, 1);
//いずれの計算も、「$num1 演算子(+-*/) $num2」の計算を行っている。
また、配列の加算演算もあまり他の言語にない機能ではないでしょうか。2つの配列を加算した場合、「左の配列に存在しないキーの要素を右の配列から取り出し、左の配列に加算する」という処理を行います。
<?php
$arr1 = [1, 2, 3];
$arr2 = ['key1' => 'val1', 'key2' => 'val2'];
$arr3 = $arr1 + $arr2;
print_r($arr3);
//$arr3を出力すると、[[0] => 1 [1] => 2 [2] => 3 [key1] => val1 [key2] => val2]という配列が出力される。
ちなみにkeyが重複している場合には何も処理がされません。
参照代入、分割代入は変数に値を格納する際の処理ですが、参照代入については値ではなく値を格納している参照先の代入を行います。C言語のポインタやJavaのオブジェクトを変数に代入する処理に近い発想ですね。
分割代入は配列の要素をそれぞれ別の変数に代入します。必要な値を一つだけ取り出すだけならそんなにメリットはないですが、一度に複数の値を取り出すことができるのと、指定したキーに対応するバリューの値をまとめて取り出すことができるのは大きなメリットではないでしょうか。(毎回for文を書いて条件分岐をしなくて良いので。)
比較演算子は概ね同じなのですが、一つ見慣れないのが宇宙船演算子(<=> ←これ)でした。左辺と右辺を比較し、左辺が小さいと−1、右辺が小さいと1、同値なら0を返す演算子です。また、文字列の結合も「{$文字列1}.{$文字列2}」で行います。
個人的に最も癖があるのが、マジカルインクリメントでした。
インクリメント(++)を行うと、アルファベットなら次のアルファベット、アルファベットと数字が混在している場合には末尾の文字/数字をインクリメントするようになります。アルファベットについては、大文字なら大文字のみ、小文字なら小文字のみで計算をするようになっています。
連番生成の際に便利ということですが、PHP以外の言語ではそんな処理やらないしなぁ…と思いました。
ここまでが演算の基礎となります。他の言語にない部分をピックアップしましたが、結構癖のある演算が多かったように思います。とはいえ大体の演算が他の言語と同じような演算なので、これらの機能を使わなければかなりスムーズにPHPを使えるのではないでしょうか。
また条件分岐と反復処理ですが、switchより便利なmatch文とJavaの拡張for文に対応するforeach文くらいかなと思います。主にmatchさえ押さえておけば、基本三構造の処理はかなりスムーズになるのではないでしょうか。
※余談ですが、商用システムの処理でswitch文ってあまり使わない気がします。推測ですが、switch文が適切な一変数による複数への条件分岐がそもそもあまりないのかなと…
複数の条件で分岐処理を行うことが多いので、それだとswitch文の出番がないのかなと思いました。あくまで個人的な意見ですが。
今回の発見
今回は処理自体に対する発見はそんなになかったように思います。強いてあげるとするなら、PHPの処理はかなり先進的というか、便利になるよう工夫されているなと感じました。使いこなせたら強力な武器となるのでしょうが、今度は他の言語で逐一書くのが煩わしくなるのかな?と思ったり…
あとは動的型付け言語は機能が豊富な傾向があるのかな?とも思いました。どうしても最初に勉強したJavaやC言語ベースになってしまいますが、それらと比べてPythonやJavaScript、PHPなんかは機能が複雑に感じます。そうすると、最初に勉強するなら面倒ですが静的型付け言語の方がいいのか…?と思ったり。その辺は他の言語ユーザーに聞いてみたいところですね。
ちなみに、最初に書いたとおりここまでの学習で競技プログラミングに挑戦できるようになります。また、一連の処理を行うことができるようになるので「何かシステムを作りたい!」となると理論上できるようになります。
ここまで学習を終えた時点で、作りたいものがあるなら挑戦してみましょう。きっと楽しいですよ!私は言語の勉強が目的なので、このまま次の関数を勉強していきます笑
コメント