更新情報)物件の路線検索に対応ほか

以前リクエストをいただいた物件の路線検索に対応しました。
不動産物件管理系の他の更新などとまとめて紹介いたします。

路線による検索・絞り込み機能を追加

更に都道府県の選択も

これまで提供してきた駅による検索に加え、路線による検索・絞り込み機能を追加しました。
この機能は、

  • 物件検索ブロックの検索項目として
  • 物件表示ブロックの抽出条件として
  • 物件検索ボタンブロックの検索条件として

ご利用いただけます。
また、この路線と「駅ー関係」の関係を「都道府県ー市区町村」にも適用し、都道府県名による検索・絞り込み機能も追加しました。

利用方法1)物件検索フォームに路線を表示

次のように、物件検索ブロックの「検索項目」で「交通」を選択することで、駅が路線によってグループ化され、路線名をチェックすることで駅を丸ごと選べるようになります。

同じように、都道府県名をチェックすることで都道府県を丸ごと選べます。

利用方法2)ある路線沿いの物件だけを表示

次のように、物件表示ブロックの抽出条件の「交通」欄が路線によってグループ化表示され、条件として路線名を選べるようになりました。路線を抽出条件とすることで、該当の路線沿い(該当の路線を選択している)物件がすべて抽出されます。

同じように、都道府県を抽出条件とすることで、該当の都道府県下の物件がすべて抽出されます。

利用方法3)ある路線沿いの物件を一発で絞り込む

次のように、物件検索ボタンブロックの検索条件の「交通」欄が路線によってグループ化表示され、検索条件として路線名が選べるようになりました。路線を検索条件とすることで、ボタンのクリック時に該当の路線に一致する物件が絞り込まれます。
各路線ごとにボタンを用意することで、「路線切替ボタン」のように利用できます。

同じように、都道府県を検索条件とすることで、ボタンのクリック時に該当の都道府県下の物件が絞り込まれます。

その他の更新

iOSでの操作を改善しました

物件表示ブロック・物件検索ボタンブロックなど一部のブロックを編集する際に、

  • iOSのキーボードの左右矢印によって入力欄を切替えると、正しく入力欄を追えない不具合
  • 同じくiOSのキーボードを閉じた際に一番上までスクロールしてしまう不具合

が発生していましたので、これらを修正しました(iframe方式を廃止)。
これにより、iPhoneやiPadなどからより快適に操作が可能です。

間取の表示順を改善しました

アルファベット順のソートにより
1DK、1K、1LDK、1R、1SLDK
となっていたのを
1R、1K、1DK、1LDK、1SLDK
としました。

技術的な説明)PHPで間取をソート

間取は「数字+記号」の組合せです。
記号がアルファベット順でかまわない場合は○○や○○などのネイティブ関数でソートが可能です。
しかし、今回の間取のようにルールに則った順番変更をしたい場合は工夫が必要です。
今回は次のようにしてソートを実行しました。

間取を点数化し、uasort関数を使って点数順に並び替えをします。
点数は2桁とし、10の位は部屋数、1の位は次の配列のように0~8までの数字を割り振って自由に定義します。
$room2score = array(
"R"=>1,
"ルーム"=>2,
"K"=>3,
"DK"=>4,
"LDK"=>5,
"SLDK"=>6,
);

次に、
$score = preg_match("/^(\d+)(.+)?$/", mb_convert_kana($label, "a", "UTF-8"), $tmp) ? $tmp[1]*10 + ($tmp[2] && $room2score[$tmp[2]] ? $room2score[$tmp[2]] : 9) : 1000
のようにして、1LDKのような間取の文字列を点数化します。
ここでは、正規表現によって先頭の数字とそれ以外に分離し、先頭の数字(部屋数)を10倍(10の位)、それ以下を上で定義した配列に則って1の位に割り当てます。これにより例えば、
1R・・・11
1ルーム・・・12
1K・・・13
1SLDK・・・16
1DK+S(未定義の間取)・・・19
2R・・・20
不明(部屋番号のない未定義の間取)・・・1000
と点数化されます。
実際はこの計算はループで行い、点数を配列に挿入します。

以上で、
$arr = array(
"1DK",
"2LDK",
);
のような関数が
$arr = array(
"1DK"=>14,
"2LDK"=>25,
);
のような点数付きの関数となります。
これを
asort($arr);
のようにしてネイティブ関数でソートをすれば完成です。

他の値を保持するため、
$arr = array(
    array("label"=>"1DK", "score"=>14),
    array("label"=>"2LDK", "score"=>25),
);
のような多重の連想配列になった場合は、ユーザー定義関数でソートするuasortを利用して次のようにしましょう。
function myfunc($a, $b) {
    return $a["score"] == $b["score"] ? 0 : ($a["score"] > $b["score"] ? 1 : -1);
}
uasort($arr, "myfunc");

2016/10/11