min — 最小値を返す関数

PHP
  • カテゴリ: PHP
  • 掲載バージョン: PHP 8.4
  • 名前空間 / FQCN / コマンド: min(...)
  • 関連: max / array_column / array_reduce / sort / usort
  • 変更履歴: PHP 8.0 以降、空配列に対して ValueError を送出

要点(TL;DR)

  • 数値や文字列、配列の中から最小値を取得する。
  • min([3, 7, 2]) // 2
  • 空配列は例外、型が混在すると比較規則で意図しない結果。事前にフィルタ・キャスト推奨。

概要

min は与えた複数の値、または配列の要素から最小値を返します。数値の最小値取得だけでなく、配列から列を抜き出しての最小値検索など実務でも頻出です。PHP 8以降は空配列で ValueError になるため、入力チェックが必須です。

構文 / シグネチャ

min(array $value): mixed
min(mixed $value, mixed ...$values): mixed
  • 引数(表)
引数必須既定値説明
valuearray|mixedはいなし配列1つ、または最初の値
valuesmixed…いいえなし2個目以降の値(可変長)
  • 戻り値mixed(最小要素の値をそのまま返す)
  • 例外/副作用
    • ValueError:空配列を渡したとき(PHP 8.0+)
    • ArgumentCountError:引数が0個のとき
    • 副作用なし

使用例

最小例

<?php

$nums = [3, 7, 2];
echo min($nums);      // 2

echo min(10, 5, 8);   // 5
echo min('b', 'a');   // 'a'(文字列比較)

実務例(価格の最安値を安全に取得)

<?php

$products = [
    ['id' => 1, 'price' => 1200],
    ['id' => 2, 'price' => null],   // 価格未設定
    ['id' => 3, 'price' => 980],
];

$prices = array_column($products, 'price');

// null や負値、非数値を除外してから最小値
$filtered = array_values(array_filter(
    $prices,
    fn($v) => is_numeric($v) && $v >= 0
));

if ($filtered === []) {
    // 例外を避けて明示的に扱う
    // ここでは在庫なしとみなす
    $minPrice = null;
} else {
    $minPrice = min($filtered); // 980
}

var_dump($minPrice);

よくある落とし穴・注意

  • 空配列で例外min([]) は PHP 8.0+ で ValueError。事前に空チェックを。
  • 型混在の比較:数値と文字列、null などが混ざると比較規則で意図外に。array_filter と明示キャストで正規化。
  • 文字列比較の挙動:すべて文字列なら辞書順比較。数値比較したい場合は数値にキャストしてから。
  • NaN/INF:浮動小数の特殊値が混ざると結果が読みにくい。業務ロジックで弾く。

代替・関連APIとの比較

  • max:最大値取得。対で覚える。
  • sort/usort:全体を並べ替える(O(n log n))。最小値だけなら min(O(n))が速い
  • array_reduce:柔軟だが記述が冗長。単純な最小値は min が簡潔。
  • array_column + min:配列の配列から特定キーの最小値を取りたいときの定番。

テスト例(Pest)

<?php

it('gets min of numeric array', function () {
    expect(min([3, 7, 2]))->toBe(2);
});

it('throws on empty array', function () {
    expect(fn () => min([]))->toThrow(ValueError::class);
});

it('ignores non-numeric after filtering', function () {
    $values = [null, '10', 5, 'x'];
    $filtered = array_filter($values, fn($v) => is_numeric($v));
    expect(min($filtered))->toBe(5);
});

トラブルシュート(エラー別)

症状/エラー原因対処
ValueError: min(): Argument #1 ($value) must contain at least one element空配列を渡した事前に空チェックし、代替処理やデフォルト値を用意
ArgumentCountError: min() expects at least 1 parameter引数が0個配列または1つ以上の値を渡す
文字列で想定外の結果になる辞書順比較が走っているarray_map('floatval', ...) 等で数値に正規化
nullNaN で結果が不安定比較不能/特殊値が混在入力バリデーションで除外・補正

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする