CodeIQ MAGAZINECodeIQ MAGAZINE

覚えておくと便利!min, max関数を使ってシンプルなコードを書く方法 #PHP

2014.04.24 Category:技術コラム Tag: ,

  • 19
  • このエントリーをはてなブックマークに追加

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

今回はifを使って記述するよりも、シンプルで読みやすいコードをPHP5.4系で動作検証してみました。
by レスキューワーク株式会社 水野史土

<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関数は、配列を複数引数にとることができます。この場合、配列同士の比較を行います。
ただし結構ややこしいので注意が必要です。

  1. 配列の長さが異なる場合

配列の長さが異なる場合は、要素数の少ない(配列の長さが短い)ものを返します。

$array1 = array(1, 2, 4);
$array2 = array(1, 5);
print_r(min($array1, $array2));

出力は次のようになります。

Array
(
    [0] => 1
    [1] => 5
)

$array1は要素が3つ、$array2は要素が2つなので、要素数の少ない$array2を返します。

  1. 配列の長さが同じ場合

配列の長さが同じ場合は、配列の要素を順に比較していき、小さいものを返します。

$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("2014-04-01",new DateTimeZone('Asia/Tokyo'));
$date2 = new DateTime("2014-03-21",new DateTimeZone('Asia/Tokyo'));
var_dump(min($date1,$date2));

出力は次のようになります。

object(DateTime)#2 (3) {
  ["date"]=>
  string(19) "2014-03-21 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "Asia/Tokyo"
}

2014-04-01と2014-03-21では、2014-03-21のほうが小さい(時間軸で前)ですね。なので、2014-04-01と2014-03-21をminで比較すると、2014-03-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なら、

$discount = min(1000, 500);

となり$discountは500です。

もし$priceが50000なら、

$discount = min(1000, 5000);

となり$discountは1000です。

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

日付の計算をする例です。
ifを使って書いてみます。

$date1 = new DateTime("2014-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日のほうが遅いですね。なので2014-04-10を出力します。
4月5日に実行した場合は、4月5日の7日後は4月12日で、4月10日より4月12日のほうが遅いですね。なので2014-04-12を出力します。

同じ処理を、maxを使って書いてみます。

$date1 = new DateTime("2014-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文で条件分岐を書くことなく、シンプルに記述できます。

DateTimeクラスを使えば、数値だけでなく、日付の比較にも応用できます。minやmaxを活用して、コードを綺麗に記述してみてはいかがでしょうか。

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

CodeIQコード銀行にあなたのコードを預けてみませんか?

  • CodeIQコード銀行ではあなたのコードを財産と考えます。
  • お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
  • 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
  • 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
  • 企業からスカウトがきたら困る人は挑戦しないでください。

興味を持った方はこちらからチャレンジを!

  • 19
  • このエントリーをはてなブックマークに追加

■この記事を書いた人

avatar

レスキューワーク株式会社 水野史土

レスキューワーク株式会社(WordPressサイト/テーマ/プラグインの診断および障害復旧サービス)の代表取締役。。WordPressおよびNovius OS(FuelPHPベースのCMS)のコアコード貢献者。concrete5.orgのコミュニティリーダー。主な著書「徹底攻略 PHP5 技術者認定 [上級] 試験問題集」(共著)。

■関連記事

GUIでアプリケーションが作れるNovius OSで効率的な開発 #PHP... 「アプリケーション作成」ウィザードとは 「アプリケーション作成」ウィザードとは、Novius OSに標準同梱されているアプリケーションです。管理画面からアプリケーションの雛形を作ることができます。開発を効率化するツールとして役立ちます。 このウィザードを使ってアプリケーションの雛形を作ると、 ...
クイックソートとバブルソートを比較してみよう #PHP... クイックソートとバブルソート ソートの方法には様々な方法があります。よく知られているものには、クイックソートやバブルソートなどがあります。ほかにもソート方法がありますが、ここではこの2つを紹介します。尚、今回は要素の値は全て異なる前提とします。 バブルソート バブルソートは、一番小さい(or大...
Webサイト発注の指標にもなるconcrete5のポイント機能「Karma」とは? #concret... concrete5とは? concrete5とは、CMS(conctents management system)と呼ばれる、Webサイトをブラウザから更新できるようにするソフトウェアのことです。アメリカ、オレゴン州ポートランドで開発されていますが、英語だけでなく様々な言語に対応しています。日本語...
手軽に開発環境が作れるビルトインサーバーを使ってみよう #PHP... PHPの動作環境構築方法 PHPプログラムは、コマンドラインから実行することができます。しかし、たいていの場合は、ブラウザでアクセスし、実行することが多いでしょう。この場合、ウェブサーバーを用意してアクセスします。以下のように、いろいろな方法があります。 Apache等のウェブサーバーを起動す...
トランプのカードを混ぜる仕組み(パーフェクトシャッフル)をプログラミングで調べてみよう #PHP... トランプのカードを混ぜる トランプゲームを行う時、カードを混ぜる必要があります。カードを混ぜる方法にも、様々なものがありますが、ここでは、リフルシャッフルを取り上げます。 リフルシャッフルは、カード全体を半分に分けて、交互に一枚ずつ混ぜていく、というものです。 実際に手作業で行うと、一度に二、三...
待ったなし!今すぐPHP5.3から移行しないと起こるかもしれないトラブルまとめ #PHP... まずは確認。PHP5.4で削除されるもの セーフモード、マジッククォート、register_globals、register_long_arraysが、PHP5.4で削除されています。これらはPHP5.3で非推奨となっていたものですが、PHP5.2以前ベースで開発していた等で使っている場合はコード...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ