PHPで数値を操作する方法
著者は、 Write for DOnations プログラムの一環として、 Open Sourcing Mental IllnessLtdを選択して寄付を受け取りました。
序章
プログラミングでは数字は非常に一般的です。 これらは、画面サイズの寸法、地理的な場所、お金、ポイント、ビデオで経過する時間、ゲームアバターの位置、数値コードの割り当てによる色などを表すために使用されます。
プログラミングで数学演算を効果的に実行できることは、数値を扱う頻度が高いため、開発するための重要なスキルです。 数学の高度な理解は確かにあなたがより良いプログラマーになるのを助けることができますが、それは前提条件ではありません。 数学のバックグラウンドがない場合は、数学を、達成したいことを達成するためのツールとして、そして論理的思考を向上させる方法として考えてみてください。
PHPでは、integersとfloatsの2つの数値データ型を使用します。
- 整数は、正、負、または0(…、
-1
、0
、1
、…)の整数です。 - 浮動小数点数、または浮動小数点数は、小数点を含む実数です(
9.0
または-2.25
のように)。
このチュートリアルでは、PHPの数値データ型で使用できるさまざまな演算子と、PHPが「型ジャグリング」および組み込みの数学関数を処理する方法について説明します。
オペレーター
演算子は、1つ以上の値(またはプログラミング用語では式)を取り、別の値を生成するものです(構造自体が式になるように)。 演算子は、値に基づいてアクションを実行するようにプログラムに指示するなど、基本的な意思決定に使用されます。
代入演算子
最も基本的な演算子は代入演算子で、単一の等号=
です。 この代入演算子は、変数の値を設定するときに使用されます。 変数は箱のようなものです。 多くの異なるものが箱に保管されるかもしれません。 ボックスに追加のアイテムが追加される場合があります。 ボックス内のアイテムは、並べ替えたり、それぞれにステッカーを貼ったりすることができます。 ボックスを空にして、新しいものをボックスに追加することもできます。 これは、コードで変数が使用されたときに起こることです。 変数には名前が付けられ、その名前付き変数には次の値が割り当てられます。
$box=3; var_dump($box); $box="Hello"; var_dump($box);
変数タイプと値を表示するには、echo
の代わりにvar_dump()
関数を使用します。 $box
という名前の変数には、3
の値を持つintが割り当てられます。 次に、同じ$box
変数に"Hello"
の新しい値が割り当てられます。 これは、ボックスを空にして新しいものを追加するのと同じです。 これで、var_dump()
関数が呼び出されると、$box
変数の値に関するまったく異なる情報が得られます。
Outputint(3) string(5) "Hello"
最初の割り当ての後、$box
変数には3
の整数値が含まれます。 2番目の割り当ての後、$box
変数には、「Hello」に一致する5文字の文字列が含まれます。
$box
をより便利にするために、次のタイプの演算子を見てみましょう。
算術演算子
PHPには、電卓やペンや紙と同じようにコンピュータープログラムで機能する算術演算子があります。 注意すべき重要な側面は、操作に使用される記号です。 最も一般的な算術演算子を見てみましょう。
加算(+
):最初の値から始めて、その数値に次の値を加算します。 これは、数値自体または値を含む変数のいずれかを使用して実行できます。
$start=10; var_dump($start+3);
結果は、次の式のsumです。
Outputint(13)
減算(-
):最初の値から開始し、前の値から次の値を減算または削除します。
$start=10; var_dump($start-3);
結果は、この方程式のdifferenceです。
Outputint(7)
乗算(*
):最初の値から始めて、次の値を乗算します。
$start=10; var_dump($start*3);
これは、最初の数値を2番目の数値と同じ回数加算するのと同じです。
$start=10; var_dump($start+$start+$start);
どちらも同じ結果、方程式のproductを示します。
Outputint(30)
Division (/
):2番目の値を最初の値に入れることができる回数:
$start=10; var_dump($start/3);
結果は、次の方程式の商です。
Outputfloat(3.3333333333333)
この場合、3は10に均等に入らないため、結果は整数ではなく浮動小数点数として示されます。 (int)
を追加することで、結果を整数値として返すようにPHPに指示できます。これにより、.
以降はすべて無視されます。
$start=10; var_dump((int) $start/3);
結果を整数である整数として与える:
Outputint(3)
モジュロ(%
)と呼ばれる除算式の余り、または余りが必要な場合:
$start=10; var_dump($start%3); var_dump(3%$start);
最初のvar_dump
は、前の除算式の余りを示します。 方程式を逆にすると、モジュロは3
を返します。これは、10がゼロ回3になり、元の3が余りになるためです。
Outputint(1) int(3)
モジュロは、奇数行または偶数行に基づいてパターンを作成するときによく使用されます。 行の整数カウントが奇数か偶数かを判断するときは、%2
を使用します。
var_dump(10%2); var_dump(11%2);
偶数は2で割り切れるので、偶数の整数は常に0の結果になりますが、奇数の整数は均等に割り切れないので常に1の結果になります。
Outputint(0) int(1)
PHPは複雑な計算をすばやく実行でき、必要な計算を作成するためのツールをさらに多く提供します。 指数、パーセンテージ、平方根、およびその他の多くの操作が可能です。 これらの数学関数のいくつかを見る前に、代入演算子と算術演算子を組み合わせた別のタイプの演算子を調べてみましょう。
算術代入演算子
リンゴが10個入ったバスケットがあるとします。 これをコードで表すために、$basket = 10
と書くことができます。 次に、追加の5つのリンゴを選び、バスケットに入れます。 整数10
を使用する代わりに、$basket
変数$basket = $basket + 5
に格納されている10
の値を使用できます。 これは技術的には正しいですが、かなり冗長です。 既存のバスケットにさらに5個のリンゴを追加したいだけです。 そこで、算術代入演算子が登場します。 変数を繰り返す代わりに、$basket += 5
と書くことができます。 これは前の式とまったく同じように機能します。 コードに次のように指示します。
$basket
の値を取ります- その値に
5
を追加します - 新しい値を
$basket
に再割り当てします
これと同じ原理を他の算術演算子で使用できます。
表現 | 結果($ i = 10と仮定) |
---|---|
$i += 5
|
10+5を追加します。 結果:$i = 15
|
$i -= 5
|
10-5を引く; 結果:$i = 5
|
$i *= 5
|
10*5を掛けます。 結果:$i = 50
|
$i /= 5
|
10/5を割ります。 結果:$i = 2
|
サミーがバスケット内のリンゴのいくつかを切り刻むことにした場合、$basket -= 6
のようなものを使用できます。これにより、$basket
に割り当てられた整数9
が残ります。 これまでのところ、プログラムは次のようになっています。
$basket = 10; $basket += 5; $basket -= 6; echo $basket;
$basket
が最終行にエコーされると、最終値が得られます。
Output9
サミーは一度にたくさんのリンゴを食べることができるかもしれませんが、私は一度に1つのリンゴしか食べることができません。
インクリメント演算子
数値を1
増やすために、PHPは、二重のプラス記号(++
)である別個の増分演算子を提供します。 これは、変数を個別に(独自の行で)インクリメントするため、または式内で直接インクリメントするために使用できます。 $basket
変数の現在の値が9
であるアップルバスケットの例に戻りましょう。
++$basket; echo $basket;
最初の行は現在の値(9)に1を加算し、次の行は結果を示します。
Output10
同じことを1行で行うことができます。
echo ++$basket;
最初に、現在の値(10)に1を加算し、次の行で結果を示します。
Output11
$basket
の値がもう一度出力された場合:
echo $basket;
$basket
変数が、出力結果に追加されただけでなく、前の行で実際に更新されたことを確認します。
Output11
前の各行では、変数の前にインクリメント演算子が使用されていました。 この事前にインクリメントされたアクションは、echo
コマンドなどの他のアクションの前に変数に適用されます。 ++$basket
を使用することは、$basket += 1
を書き込むことと同じです。 インクリメント演算子は、変数の後にポストインクリメントとして使用することもできます。 変数を個別に設定する場合は順序は関係ありませんが、式内で使用する場合は順序が重要になります。 同じ行を繰り返しましょう。今回は、変数の後にインクリメント演算子を置きます。
$basket++; echo $basket;
最初の行は現在の値(11)に1を加算し、次の行は結果を示します。 これは、前の例のプリインクリメントラインとまったく同じように機能します。
Output12
ここで、ポストインクリメントされた値との違いに到達します。
echo $basket++;
echo
アクションは値が増加する前に発生するため、2番目のecho
の結果は、1増加する前の$basket
の値を示しています。
Output12
最後のecho
コマンドは、echo
が処理された後に変数が実際にインクリメントされたことを確認します。
echo $basket;
$basket
の最終値を示す:
Output13
PHPには、インクリメント演算子に加えて、デクリメント演算子を使用して値を1
だけ減らす機能があります。
デクリメント演算子
値を1
減らすには、デクリメント演算子を使用できます。これは、二重マイナス記号(--
)です。 インクリメント演算子と同様に、この演算子は変数の前または後に追加できますが、位置はプログラムの出力に影響を与える可能性があります。
echo --$basket; # Pre-decrement echo $basket--; # Post-decrement echo $basket;
最初の行は、echo
コマンドが実行される前に、現在の値(13)から1
を削除します。 次の行は、ポストデクリメント演算子が評価される前にecho
コマンドを実行し、出力を同じままにします。 繰り返しになりますが、最後のecho
は、$basket
の値が前の行で実際に減少し、値が減少したことを示しています。
Output12 12 11
演算子の優先順位が結果でどのように重要な役割を果たすかを検討するときは、演算子のこの順序を覚えておいてください。
演算子の優先順位
演算子のprecedenceは、2つの式を「緊密に」バインドする方法を指定します。 これは、「操作の順序」と呼ばれることがよくあります。 これは、さまざまな演算子がより重要になり、最初に適用されることを意味します。 数式を評価する場合、乗算と除算は常に加算と減算の前に実行されます。 例えば:
echo 1 + 5 * 3;
この式では、乗算(*
)演算子は、加算(+
)演算子よりも優先順位が高いため、最初に評価されます:5 * 3 = 15
。 その後、加算は1 + 15 = 16
として実行されます。 これにより、16
の最終結果が得られます。
Output16
演算の順序に従わなかった場合、1 + 5
が最初に評価され、次にその結果に乗算が適用され、6 * 3 = 18
が得られます。
インクリメント演算子とデクリメント演算子は数値に適用できません。 それらは変数とともに使用されます。 ただし、その値をインクリメントまたはデクリメントする方程式に変数を追加することはできます。 これらのインクリメントまたはデクリメントされた変数が使用される場合、方程式はインクリメントまたはデクリメント操作の前または後に実行されます。
$my_num = 8; echo 7 + $my_num++ + 9; echo $my_num; echo 7 + --$my_num + 9; echo $my_num;
最初のecho
行では、インクリメント後の演算子が値を増やす前に、$my_num
の元の値を使用して数式が実行されます。 echo 7 + 8 + 9;
と書いたかのように、24
の結果が得られます。 2番目のecho
から、$my_num
が9に設定されていることがわかります。 2番目の数式は、事前デクリメント操作の後に実行されます。つまり、$my_num
の値は8に設定され、数式自体は同じです。 数式が実行された後、ポストデクリメント演算子が実行され、$my_num
変数の最終結果が得られます。
Output24 9 24 8
グループ化操作
括弧は常に最高レベルの優先順位を持ち、操作をグループ化したり、優先順位を強制したりする方法を提供します。 たとえば、前の式に括弧を追加します。
echo (1 + 5) * 3;
括弧内の項目は乗算の前に評価されるため、結果は異なります。
Output18
数式の演算子の優先順位を要約すると、次のようになります。
- 括弧は左から右に評価されます。
- 乗算と除算は左から右に評価されます。
- 最終結果は、左から右への加算と減算を使用して評価されます。
タイプジャグリング
PHPは、変数が宣言または設定されるときに変数タイプを定義しません。 代わりに、変数のタイプは、変数が使用されるコンテキストによって決定されます。 var_dump()
を使用して、タイプを含む変数の詳細を表示できます。
$my_var = 'string'; var_dump($my_var); $my_var = 1; var_dump($my_var);
文字列値が変数に割り当てられると、その変数は文字列になります。 次に、同じ変数に整数値が割り当てられると、整数になります。
Outputstring(6) "string" int(1)
PHPは、方程式の評価に基づいてタイプも設定します。
$var1 = 1.2; $var2 = 2; $var3 = 12; var_dump($var1 * $var2); var_dump($var3 * $var2); var_dump($var1, $var2, $var3);
どちらかのオペランドがfloatの場合、最初のvar_dump
に示すように、両方のオペランドがfloatとして評価され、結果はfloatになります。 それ以外の場合、オペランドは整数として解釈され、2番目のvar_dump
に示すように、結果も整数になります。
Outputfloat(2.4) int(24) float(1.2) int(2) int(12)
3番目のvar_dump
から、これによってオペランド自体のタイプが変更されないことがわかります。 唯一の変更点は、オペランドの評価方法と、結果として得られる式自体のタイプです。
文字列やブール値などの他のデータ型も数値に変換される場合があります。 これは多くの混乱を引き起こす可能性があるため、避けるのが最善です。 PHPは通知または警告を生成しますが、それでも変数を評価可能な型に「ジャグリング」するために最善を尽くします。 例えば:
表現 | 結果 | タイプジャグリング |
---|---|---|
2 * false
|
0 | ブール値は整数0 に変換されます
|
2 * true
|
2 | ブール値は整数1 に変換されます
|
2 * 'hi'
|
0 | 文字列は整数0 に変換されます
|
2 * '1'
|
2 | 文字列は整数1 に変換されます
|
PHPのタイピングを緩くすると、コードの記述が速く簡単になりますが、問題の追跡が難しくなることがよくあります。 アプリケーションで使用される変数タイプに注意してください。
数学関数
関数は、プログラムで繰り返し使用できるステートメントのブロックです。 PHPには、追加の数学計算を実行できる多くの組み込み関数が付属しています。
正の数と負の数の両方を操作する場合、abs
関数を使用して数の絶対値を取得できます。
echo abs(-1.3);
これは、数値の前の+
または-
を無視し、数値自体を返すだけです。
Output1.3
数値で推定する場合、またはfloatの整数値を取得する場合は、複数のオプションがあります。
echo round(1.3); echo round(1.5); echo ceil(1.3); echo floor(1.5);
round
関数は最も近い整数を返し、.5
はより高い数値に評価されます。 ceil
関数は常に切り上げられますが、floor
関数は常に切り下げられます。
Output1 2 2 1
どの円の比率も同じです。 これは事実であるため、円の円周は、その直径にpi
(Π)と呼ばれる特別な数値を掛けることによって決定できます。
echo pi(); echo 4 * pi();
PHPのpi
関数は、pi
の最初の14桁を返します。これは、pi
が無理数であり、10進数が終了しないことを意味するためです。 この関数を使用して、直径4の円の円周を計算できます。
Output3.1415926535898 12.566370614359
コインを投げる場合でも、サイコロを振る場合でも、結果の目標が偶然である場合、ランダムな数字がツールを提供します。 PHPは、rand
関数を提供して、この予測不可能なランダムな結果を返します。
echo rand();
この機能は、0からマシンに設定されているgetrandmax
までの数値を表示します。 ランダム性を少し少なくする必要がある場合、または最大数を増やしたい場合は、最小値と最大値を包括的に指定できます。 ランダムな3桁の数字を返すには:
var_dump(rand(100, 999));
このrand
関数が呼び出されるたびに、100から999までの3桁の数値が返されます。
乱数を返す計算は実際にはランダムではないため、セキュリティと暗号化に関しては、PHPはより暗号的に安全な関数を提供します。 カードのシャッフルや当選番号の抽選などの偏りのない結果に適した暗号論的乱数整数を生成するには、random_int
関数を使用します。
var_dump(random_int(-999, 999));
random_int
では、包括的最小数と最大数を指定する必要があります。 rand
とrand_int
はどちらも負の数を受け入れます。
バイト文字列を取ることができるソルト、キー、または初期化ベクトルの暗号的に安全な値を生成する場合は、指定された文字列長でrandom_bytes
を使用します。
var_dump(random_bytes(20));
毎回新しいランダムなバイト文字列を取得します。これは次のようになります。
Outputstring(20) "q8?Ud;??W?p4?C????"
PHPにはさらに多くの組み込み数学関数があります。 詳細については、php.netのドキュメントをご覧ください。
結論
このチュートリアルでは、整数および浮動小数点の数値データ型を操作するときに使用する多くの演算子について説明しました。 また、演算子の優先順位と位置が結果にどのように影響するかを示しました。 これらの結果は、PHPが変数タイプと発生する可能性のある問題を「ジャグリング」する方法に私たちをもたらしました。 最後に、組み込み関数の簡単な紹介により、アプリケーションで利用できる数学的な選択肢が広がりました。 他のデータ型の詳細については、PHPのデータ型についてを参照してください。