教育・子育て

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
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

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

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 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
23.75 ALIS
Eye catch
クリプト

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

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

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

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

【科学(化学)】進化に必要だった猛毒のガス~酸素~

Like token Tip token
25.63 ALIS
Eye catch
ビジネス

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

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

テレビ番組で登録商標が「言えない」のか考察してみる

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

約2年間ブロックチェ-ンゲームをして

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

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

Like token Tip token
24.07 ALIS