2010/04/13
カテゴリ : Tech
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演算に馴染みがない人には分かりにくい点や、
チェックボックスの数に上限があることですが、
特定の状況下においては、高速かつ少ないデータ量で情報を扱うことができます。
トラックバックURI
最近の記事
システム開発エンジニア募集! [2012年02月03日 : 小林有佳]
OpenVPNで細々便利な設定 [2012年01月31日 : 門脇優児]
【iOS】Viewの開発・デバッグに役立つ色々 [2012年01月23日 : 中川善樹]
PHPDocumentorの利用方法まとめ [2012年01月19日 : 笹亀弘]
Google Chart Toolsを使ってサイトマップを描こう! [2011年12月21日 : 志田仁美]
stumpwm設定v2 [2011年12月19日 : 門脇優児]
Mashup Awards 7の授賞式が行われました [2011年12月16日 : 中川善樹]
社員旅行に行きました [2011年12月12日 : 大橋寛子]
iCloud風のアイコンを作成する(Fireworks) [2011年12月07日 : 和田記光]
iScroll4でネイティブに近いスマホ向けHTMLページを作成する [2011年12月02日 : 松田惇]













コメントフォーム