検索対象・検索項目共に最小値・最大値がある場合の考え方~PHPでの書き方付き~

エンジニア

かねち

お久しぶりです!
2年目に突入し、はやくも半年が経過しました。

エンジニア

かねち

今回は、実際に案件の対応のときに頭で考えてややこしくなってしまった、 金額や日付などの最小値・最大値のある検索対象を、最小値・最大値を決めて検索する時の考え方を書いていきます!

エンジニア

かねち

一度理解するとなんてことないのですが、
頭だけで考えると考えが絡まってしまったので、自分のためのおぼえがきもかねています。

今回の検索は、下記の例ような検索をしたい場合に使用できます。

・200,000円~350,000円の家具を、
100,000円~300,000円で絞り込んだ時に出したい。

・9/15~10/15に開催されるイベント情報を、
8/1~10/1で絞り込んだ時に出したい。

 

つまり、検索条件と検索対象のどちらにも金額や期間などの幅がある場合ですね。

よくある間違いから紹介するので、お急ぎの方は飛ばして結論からどうぞ!

よくある間違い

よくある間違いとして、上限同士・下限同士を比較してしまう下記のようなパターンがあります。

この場合、たしかに検索対象の最小値・最大値がどちらも検索した数値の幅に収まっていれば検索結果に表示されます。

しかし、この場合は検索対象の最小値・最大値がどちらか一方でも検索範囲に収まっていなければ、
検索には出てこないようになってしまいます。

そのため、こちらは間違った絞り込み方となります。

結論

ではどうするのかというと、検索対象の最小値・最大値それぞれを、

検索の最小値・最大値と比べ、どちらかに当てはまれば検索結果に表示、となります!

例で挙げた

・200,000円~350,000円の家具を、
100,000円~300,000円で絞り込んだ時に出したい。

は下記のようになります。

$searchmin = 100000;
$searchmax = 300000; 
$itemmin = 200000; 
$itemmax = 350000;

if ($searchmin <= $itemmin && $itemmin <= $searchmax || $searchmin <= $itemmax && $itemmax <= $searchmax){
    echo('検索結果に表示する'); 
} else {
    echo('検索結果に表示しない'); 
}

ちなみに、実際に使用する際は検索の最小値・最大値が未選択の場合は、無制限扱いなどの対応をすることも多いと思います。

その場合は下記のようになります。


if (!empty($searchmin) && !empty($searchmax)){
    if ($searchmin <= $itemmin && $itemmin <= $searchmax || $searchmin <= $itemmax && $itemmax <= $searchmax){
        echo('検索結果に表示する');
    } else {
        echo('検索結果に表示しない');
    }
} elseif (!empty($searchmin)){
    if ($searchmin <= $itemmin){
        echo('検索結果に表示する');
    } else {
        echo('検索結果に表示しない');
    }
    
} elseif (!empty($searchmax)){
    if ($itemmax <= $searchmax){
        echo('検索結果に表示する');
    } else {
        echo('検索結果に表示しない');
    }
}

検索最大値が未選択の場合、検索の値と検索対象の最小値同士を比較、
検索最小値が未選択の場合、検索の値と検索対象の最大値同士を比較するだけですね。

最後に

いかがでしたでしょうか?

こうして説明してみると簡単なのに、期間が開いてからやろうとするとパッとできずにこんがらがってしまうんですよね。

検索条件と検索対象が混ざってしまったり…。

そうなってしまったら、皆さんも頭だけで考えずに紙に書いたり色分けしたりしましょう!おすすめです!

今回説明した考え方は、例に挙げた家具や日付のほかに、
求人の給与や旅行プランなど、いろんな検索に使えるので、ぜひ使ってみてください。

ところで

ロジカルスタジオでは、フロントエンドエンジニア・バックエンドエンジニアを募集しております!

下記リンクからお待ちしております!