0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPで複数検索を書くときにbit列に分割して実装した.

Posted at

はじめに

最近宮蘭フェリーハッカソンに向けて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にはおかしな数字が入っていないとします(関数を呼ぶ時点で排除しているので).

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?