- カテゴリ: 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
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| value | array|mixed | はい | なし | 配列1つ、または最初の値 |
| values | mixed… | いいえ | なし | 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', ...) 等で数値に正規化 |
null や NaN で結果が不安定 | 比較不能/特殊値が混在 | 入力バリデーションで除外・補正 |
参考リンク
- PHP Manual: min
- PHP Manual: Comparison Operators
- [PHP 8.0 Migration Guide (min/max on empty arrays)]https://www.php.net/manual/en/migration80.incompatible.php#migration80.incompatible.core.internal-functions-empty-input)

