bit演算の考え方を応用して大量のチェックボックスを管理する
こんにちはアシアルの岡本です。
暖かい日が多くなりましたが、桜はもう散り際ですね。
週末は車や電車の窓から桜をみながら、
秩父へ1泊二日の小旅行へ行ってまいりました。
たまにはパソコンから離れて自然に囲まれることも必要です、
常に鞄の中にはノートパソコンと通信カードが入っているのですが…
今日はHTMLフォームのチェックボックスを扱うテクニックの紹介をしたいと思います。
大量のチェックボックスの情報をGETリクエストで引き回したり、
データベースに格納するのは一苦労ですがbit演算の考え方を応用すると上手く解決する場合があります。
各チェックボックスをbit演算に見立て桁を割り当てることで、
32ビットなら最大32個、64ビットなら最大64個の情報を一つの数値型に格納することができます。
数に上限があるため用途は限られますが、
例えば、ネットショップで商品毎に色を持たせたい場合に使ったことがあります。
割り当てた桁の値で2の乗数を求めることで色の値が作れます。
また、色の値を加算することで、複数の色が選択された状態を表現できます。
例えば、
・赤色と黒色のチェック柄のスカートは
・銀と金の指輪で緑の石がはめ込まれている場合は、
・因みに全ての色を使っている場合は
カンマ区切りで全色列挙すると、
0,1,2,3,4,5,6,7,8,9
19バイトの文字列になるのでだいぶ節約できますね。
RDB(今回はPostgreSQL)から該当する赤色を使っている商品を探す場合は以下の通りになります。
金と緑を使っている商品を探す場合は以下の通りです。
この方法の問題は、bit演算に馴染みがない人には分かりにくい点や、
チェックボックスの数に上限があることですが、
特定の状況下においては、高速かつ少ないデータ量で情報を扱うことができます。
暖かい日が多くなりましたが、桜はもう散り際ですね。
週末は車や電車の窓から桜をみながら、
秩父へ1泊二日の小旅行へ行ってまいりました。
たまにはパソコンから離れて自然に囲まれることも必要です、
常に鞄の中にはノートパソコンと通信カードが入っているのですが…
今日はHTMLフォームのチェックボックスを扱うテクニックの紹介をしたいと思います。
大量のチェックボックスの情報をGETリクエストで引き回したり、
データベースに格納するのは一苦労ですがbit演算の考え方を応用すると上手く解決する場合があります。
各チェックボックスをbit演算に見立て桁を割り当てることで、
32ビットなら最大32個、64ビットなら最大64個の情報を一つの数値型に格納することができます。
数に上限があるため用途は限られますが、
例えば、ネットショップで商品毎に色を持たせたい場合に使ったことがあります。
| 桁 | 色値 | 色 |
|---|---|---|
| 0 | 1 | ブラック |
| 1 | 2 | ホワイト |
| 2 | 4 | レッド |
| 3 | 8 | グリーン |
| 4 | 16 | ブルー |
| 5 | 32 | シアン |
| 6 | 64 | マゼンダ |
| 7 | 128 | イエロー |
| 8 | 256 | シルバー |
| 9 | 512 | ゴールド |
割り当てた桁の値で2の乗数を求めることで色の値が作れます。
また、色の値を加算することで、複数の色が選択された状態を表現できます。
例えば、
・赤色と黒色のチェック柄のスカートは
2^0 + 2^2 = 1 + 4 = 5で色状態5になります。
・銀と金の指輪で緑の石がはめ込まれている場合は、
2^8 + 2^9 + 2^3 = 256 + 512 + 8
= 776
となり、色状態は776になります。・因みに全ての色を使っている場合は
2^10 - 1 = 1023になります。
カンマ区切りで全色列挙すると、
0,1,2,3,4,5,6,7,8,9
19バイトの文字列になるのでだいぶ節約できますね。
RDB(今回はPostgreSQL)から該当する赤色を使っている商品を探す場合は以下の通りになります。
postgres=# select * from test_item where color = color | 4 ; id | name | color ----+--------------------+------- 1 | チェックのスカート | 5 3 | 色が色々ある何か | 1023
金と緑を使っている商品を探す場合は以下の通りです。
postgres=# select * from test_item where color = color | 520; id | name | color ----+------------------+------- 2 | ペリドットの指輪 | 776 3 | 色が色々ある何か | 1023
この方法の問題は、bit演算に馴染みがない人には分かりにくい点や、
チェックボックスの数に上限があることですが、
特定の状況下においては、高速かつ少ないデータ量で情報を扱うことができます。
コメントフォーム
トラックバック
最近の記事
- もうすぐ健康診断があるんだ・・・ [2010年09月02日 : 阿部恵]
- Photoshopで壁紙を作りながら、基本的な使い方を覚える [2010年09月01日 : 鴨田健次]
- はじめての共同作業 Canvas編 (node.js + websocket) [2010年09月01日 : 中川善樹]
- 「PHP×Flex(後編)」PHPテクニカルセミナー(無料)第4弾の募集を開始しました!! [2010年08月26日 : 和田記光]
- 【HTML5】Canvasでお絵かきしてみた(前編) [2010年08月25日 : 橋本章史]
- MacにgroongaのMySQL用ストレージエンジン [2010年08月23日 : 笹亀弘]
- Appleのサイトで見たiPhone4をFireworksで描いてみました-1/2 [2010年08月19日 : 和田記光]
- iPad版の会社紹介を作ってみました [2010年08月19日 : 小林有佳]
- iPhoneアプリ開発開始時に気をつけるべきファイルの取り扱い (2) [2010年08月19日 : 亀本大地]
- symfonyセミナー動画無料公開! [2010年08月13日 : 岡本雄樹]



最近のコメント