教育・子育て

min, max関数を使ってシンプルなコードを書く方法

mizuno's icon'
  • mizuno
  • 2020/02/19 23:11
Content image

minとmaxは、引数から最小/最大の値を探し、それを返す、という一見すると地味な関数です。しかしこれらの関数を上手く活用すると、if文の代わりになります。

※本記事のコードはPHPで動作検証しています。

<Part1> min関数の活用法

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を返します。

<Par2> max関数の活用法

max関数の使い方はmin関数と同じですが、返り値の決め方が異なります。min関数は小さいものを返しましたが、max関数は大きいものを返します。

echo max(1,2,4); // 「4」が出力される
echo max('i','a'); // 「i」が出力される

min同様、配列同士の比較や日付の比較にminを使うこともできます。

実際に使ってみる

では、実際にminやmax関数を使ってみましょう。比較のため、ifを使った場合のコードも掲載しています。

例1. 金額$priceの10%を割引する。ただし割引額は最大1,000円まで

割引額の計算をする、という想定です。 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です。

例2. 2020年4月10日以降で、かつ今日から一週間以上後の日を取得する

日付の計算をする例です。 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文で条件分岐を書くことなく、シンプルに記述できます。数値だけでなく、日付の比較にも応用できるので便利です。

 

他の記事もごらんください。

 

Supporter profile iconSupporter profile icon
Article tip 2人がサポートしています
獲得ALIS: Article like 22.86 ALIS Article tip 1.30 ALIS
mizuno's icon'
  • mizuno
  • @mizuno
月70万PVウェブメディア「計算フォーム」 https://calculator.jp/ でウェブ集客支援。書籍「WordPressユーザーのためのPHP入門」他一冊。TWITTER: @ounziw

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
ビジネス

海外企業と契約するフリーランス広報になった経緯をセルフインタビューで明かす!

Like token Tip token
16.10 ALIS
Eye catch
他カテゴリ

ALISのシステム概観

Like token Tip token
5.00 ALIS
Eye catch
他カテゴリ

防犯意識 マーキング 下書き供養④

Like token Tip token
24.07 ALIS
Eye catch
クリプト

Bitcoinの価値の源泉は、PoWによる電気代ではなくて"競争原理"だった。

Like token Tip token
159.32 ALIS
Eye catch
トラベル

無料案内所という職業

Like token Tip token
84.20 ALIS
Eye catch
他カテゴリ

BCAAは本当に必要なのか?徹底的調査

Like token Tip token
1.20 ALIS
Eye catch
他カテゴリ

京都のきーひん、神戸のこーへん

Like token Tip token
12.10 ALIS
Eye catch
クリプト

NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
121.79 ALIS
Eye catch
他カテゴリ

警察官が一人で戦ったらどのくらいの強さなの?『柔道編』 【元警察官が本音で回答】

Like token Tip token
114.82 ALIS
Eye catch
クリプト

続・NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
6.37 ALIS
Eye catch
他カテゴリ

機械学習を体験してみよう!(難易度低)

Like token Tip token
124.82 ALIS
Eye catch
教育・子育て

【科学】アリストテレスにデカルトにニュートンに…みな光に取り憑かれた~光学の発展~

Like token Tip token
23.75 ALIS