Posted at

配列関数をつかって範囲検索してみよう

More than 5 years have passed since last update.

PHP にはこれでもかという数の関数やクラスが用意されていますが、今回はその中でも比較的利用されているであろう配列関数の中でも比較的使われていないであろう関数を使って面倒な範囲検索の実装を簡単に済ませてみたいと思います。

例題: 3つの時間帯を0時から8時ならば朝型、9時から16時ならば昼型、17時から23時ならば夜型として、起きている時間が最も多くを占める時間帯を判定せよ

これ、比較を中心に実装すると結構面倒臭いんですよね。if 文ネストしまくったり時間帯の評価指数みたいなものをコントロールするのに明確な終わりを意味づけにくかったり。でも、array_intersect() を使えばすべて解決します。

<?php

// 8時から23時まで起きている
$activeTime = range(8, 23);
$timeZone = array();
$timeZone['morning'] = count(array_intersect($activeTime, range(0, 8)));
$timeZone['afternoon'] = count(array_intersect($activeTime, range(9, 16)));
$timeZone['night'] = count(array_intersect($activeTime, range(17, 23)));
arsort($timeZone);
printf('You are the %s guy!', key($timeZone));

このように取り扱う値2進化 + 配列化することで範囲検索だとか複合検索のように複雑な実装が必要な検索処理を PHP の組み込み関数にまかせることができます。2進数の演算とかお手の物だという方にとっては冗長なアプローチだと思いますが…

因みに array_intersect() を繰り返すことで積が求められますし、対象となる要素を先に array_merge() することで和が求められますし、array_diff() を使えば差も求められますので、ちょっとした検索機能ならばデータベースにクエリ投げるよりも変数展開したデータを配列関数で評価した方が高速ですし実装の手間も少ないです。お試し下さい。PHP は素晴らしいですね。