minとmaxは、引数から最小/最大の値を探し、それを返す、という一見すると地味な関数です。しかしこれらの関数を上手く活用すると、if文の代わりになります。
※本記事のコードはPHPで動作検証しています。
min関数は、いくつかの値から最小のものを返す関数です。非常にシンプルですね。シンプルな関数ですが、使い方はいろいろあります。とり得る引数も様々です。
min関数は配列を引数にすることができます。この場合、配列の要素の中で最も小さい値を返します。
実行例
$a1 = array(1,2,4);
echo min($a1); // 「1」が出力される
min関数は値を引数にすることができます。この場合は、引数が2つ以上必要です。引数の中で最も小さい値を返します。
echo min(1,2,4); // 「1」が出力される
min関数は数値の大小だけでなく、文字列の比較もできます。
echo min('i','a'); // 「a」が出力される
文字列の場合、アルファベット順で前のものが小さい(a<z)となります。なので、aとiを比較するとaの方が小さい、と判定されます。
min関数は、配列を複数引数にとることができます。この場合、配列同士の比較を行います。 ただし結構ややこしいので注意が必要です。
配列の長さが異なる場合
配列の長さが異なる場合は、要素数の少ない(配列の長さが短い)ものを返します。
$array1 = array(1, 2, 4);
$array2 = array(1, 5);
print_r(min($array1, $array2));
出力は次のようになります。
Array
(
[0] => 1
[1] => 5
)
$array1は要素が3つ、$array2は要素が2つなので、要素数の少ない$array2を返します。
配列の長さが同じ場合
配列の長さが同じ場合は、配列の要素を順に比較していき、小さいものを返します。
$array1 = array(1, 2, 4);
$array2 = array(1, 5, 6);
print_r(min($array1, $array2));
出力は次のようになります。
Array
(
[0] => 1
[1] => 2
[2] => 4
)
$array1と$array2の要素数はどちらも3つです。長さが同じなので、要素を順に比較していきます。最初の要素はどちらも1です。次の要素を調べると、2と5なので、2のほうが小さいですね。このため、$array1を返します。
min関数の引数に、DateTimeオブジェクトを渡すと、日付の比較をすることもできます。
$date1 = new DateTime("2020-03-01",new DateTimeZone('Asia/Tokyo')); $date2 = new DateTime("2020-02-21",new DateTimeZone('Asia/Tokyo')); var_dump(min($date1,$date2));
出力は次のようになります。
object(DateTime)#2 (3) {
["date"]=>
string(19) "2020-02-21 00:00:00"
["timezone_type"]=>
int(3)
["timezone"]=>
string(10) "Asia/Tokyo"
}
2020-03-01と2020-02-21では、2020-02-21のほうが小さい(時間軸で前)ですね。なので、minで比較すると、2020-02-21を返します。
max関数の使い方はmin関数と同じですが、返り値の決め方が異なります。min関数は小さいものを返しましたが、max関数は大きいものを返します。
echo max(1,2,4); // 「4」が出力される
echo max('i','a'); // 「i」が出力される
min同様、配列同士の比較や日付の比較にminを使うこともできます。
では、実際にminやmax関数を使ってみましょう。比較のため、ifを使った場合のコードも掲載しています。
割引額の計算をする、という想定です。 ifを使うと、例えば次のようになります。(端数の処理は省略しています)
$discount = 0.1 * $price;
if ($discount > 1000) {
$discount = 1000;
}
同じ処理を、minを使って書いてみると、一行で書けます。
$discount = min(1000, 0.1 * $price);
もし$priceが5000なら、0.1 * $priceが500なので
$discount = min(1000, 500);
となり$discountは500です。
もし$priceが50000なら、0.1 * $priceが5000なので
$discount = min(1000, 5000);
となり$discountは1000です。
日付の計算をする例です。 ifを使って書いてみます。
$date1 = new DateTime("2020-04-10",new DateTimeZone('Asia/Tokyo')); $date2 = new DateTime("now",new DateTimeZone('Asia/Tokyo'));
$date2->add(new DateInterval('P7D'));
if ($date1 > $date2) {
$date = $date1;
} else {
$date = $date2;
}
echo $date->format('Y-m-d');
4月1日に実行した場合は、4月1日の7日後は4月8日で、4月10日のほうが遅いですね。なので2020-04-10を出力します。 4月5日に実行した場合は、4月5日の7日後は4月12日で、4月10日より4月12日のほうが遅いですね。なので2020-04-12を出力します。
同じ処理を、maxを使って書いてみます。
$date1 = new DateTime("2020-04-10",new DateTimeZone('Asia/Tokyo')); $date2 = new DateTime("now",new DateTimeZone('Asia/Tokyo'));
$date2->add(new DateInterval('P7D'));
$date = max($date1,$date2);
echo $date->format('Y-m-d');
minやmaxを使ったほうがシンプルに記述できることが分かるでしょう。
数値を比較する場合、minやmaxを活用すると、if文で条件分岐を書くことなく、シンプルに記述できます。数値だけでなく、日付の比較にも応用できるので便利です。