min()は複数のパラメーターを受信したり、パラメーターとして配列を受信して、最小値を返すことができます。
echo min(2, 3, 1); // 出力:1
echo min([2, 3, 1]); // 出力:1
簡単に思えますが、問題はデータ構造が複雑で、パラメータータイプが不明な場合に発生することがよくあります。
着信パラメータータイプが一貫していない場合、PHPは暗黙的な変換を実行し、予期しない結果につながる可能性があります。
echo min(0, 'abc'); // 出力:'abc'
上記の例では、 「ABC」は0に変換され、MINは数を比較し、0と0は等しいため、 「ABC」の最初の発生が返されます。これにより、人々は返されるのは文字列の最小値であると誤って考えさせますが、実際には数字で比較されます。
推奨事項:さまざまな種類のパラメーター、特に数字と文字列を混合しないでください。
多次元配列を渡すとき、 min()は配列の奥深くではなく、トップレベルの要素のみを比較します。
$data = [[2, 3], [1, 5]];
echo min($data); // 出力:[1, 5]
これは、PHPが「配列比較」の形で配列を比較するためです。実際のルールは非常に複雑であり、簡単に混乱を引き起こす可能性があります。
推奨事項:多次元配列で最小値を取得するには、カスタムロジックを使用してトラバースを使用して、 min()への依存を避ける必要があります。
ブール値は、比較に参加すると整数に変換され、trueは1になり、falseは0になります。
echo min(true, 5); // 出力:1
echo min(false, -1); // 出力:-1
これは、変数値が初期化や検証なしでtrue/falseで渡されるため、誤った結果を簡単に生成できます。
提案: min()に渡されたすべてのパラメーターは、最初にターゲットタイプに明示的に変換する必要があります。
min()は、キーではなく値、連想配列でさえも返します。
$data = ['a' => 3, 'b' => 1, 'c' => 2];
echo min($data); // 出力:1
最小値に対応するキーを見つけたい場合、この方法は機能しません。次の方法を使用する必要があります。
$min = min($data);
$key = array_search($min, $data); // 出力 b
一部の開発者は、2つの価格フィールドを比較するなど、フォームの入力をmin()に直接渡します。
$min_price = min($_POST['price1'], $_POST['price2']);
ただし、入力が空または文字列の場合、予期しない動作を引き起こします。例えば:
$_POST['price1'] = '0';
$_POST['price2'] = ''; // 空の文字列はに変換されます 0
結果: min( '0'、 '')は実際に0と0を比較し、最初のもの、つまり'0'を返しますが、これはあなたが望む結果ではないかもしれません。
提案: min()を使用する前に、ユーザー入力を完全にフィルタリングおよび検証します。
一連のオブジェクトを処理する場合、 min()を直接使用すると、致命的なエラーや予測不可能な動作につながる可能性があります。
class Product {
public $price;
public function __construct($price) {
$this->price = $price;
}
}
$products = [new Product(100), new Product(50)];
echo min($products); // 警告またはエラー
PHPは2つのオブジェクトを比較する方法を知らないためです。比較フィールドを手動で抽出する必要があります。
$min_price = min(array_map(function($p) {
return $p->price;
}, $products)); // 出力:50
MIN()に加えて、開発者をしばしば立ち往生させるPHP機能がいくつかあります。
0 == 'a' // true
0 === 'a' // false
提案:厳密な比較のために、常に===および!==を使用することを優先します。
$arr = [];
$arr[true] = 'yes';
$arr[1] = 'one';
var_dump($arr); // 結果には1つの要素しかありません,キーは自動的に上書きされます
Boolean Trueは整数1に変換され、競合が発生します。
$a = [1, 2];
$b = &$a;
$b[] = 3;
print_r($a); // 出力:Array ( [0] => 1 [1] => 2 [2] => 3 )
参照を使用すると、値を実現せずに簡単に変更できます。
MIN()は一見単純な機能ですが、単純な関数は、PHPの柔軟でゆるいタイプの言語に複雑な問題を埋めることもできます。それを使用する場合は、着信パラメーターのタイプと構造を明確に理解し、PHPに独自の裁量で比較する方法を決定させないようにしてください。さらに、潜在的なエラーにつながる可能性のあるPHPには、多くの「合理的な」構文動作があります。開発者は常に警戒し、単体テストとデータ検証を通じてコードが堅牢であることを確認しようとする必要があります。