はじめに
最近宮蘭フェリーハッカソンに向けてSNSもどきを作ってるんですが,ジャンルで分類されているDBにフロント側から複数のジャンルで検索をかけたいときにサーバー側はどういう数字を受け取ればいいんだろうということを考えていてbitを使ってみることにしました.
bit列
今回だと8種類ジャンルがあったので渡された数字が4(=00000100)だと3つめのジャンルで検索かけるというような実装をするようにしました.
実装例
$genre_num = 4;//検索をかけたいジャンル
$genre_bit = decbin($genre_num);
$zero = "";
for($i=0;$i<8-strlen($genre_bit);$i++){
$zero = $zero."0";
}
$genre_bit = $zero.$genre_bit;
$sql = "SELECT * FROM table";
$flag = false;
for($i=7;$i>=0;$i--){
if($genre_bit[$i] == "1"){
if($flag == false){
$sql = $sql." WHERE genre=".(7-$i+1)." ";
$flag = true;
}
else{
$sql = $sql."OR genre=".(7-$i+1)." ";
}
}
$ genre_numに検索するための数字が入っているのでdecbin()に渡して二進数の文字列にしています.
次に今回は8種類なので最初の方を0埋めします.そして文字列の後ろから比較していき,1になっている部分でSQL文を追加していきます.そして最後にSQLを実行すれば多分動きます.
$flagは最初のWHERE句を呼ぶために立てているので一度1を見つけたらflagが立ってそこには入らなくなります.
終わりに
正直もっといい方法あるんじゃないかってすごく思うんですけど今回自分なりに工夫して実装してみました.意見とかマサカリとかお待ちしております.
補足
このプログラムは検索部分のみを切り出してきたものなのでそもそも$ genre_numにはおかしな数字が入っていないとします(関数を呼ぶ時点で排除しているので).