비트연산으로 다중값 처리하기
컨텐츠 정보
- 19,835 조회
- 6 추천
- 목록
본문
폼에서 어떤 설정들을 다중으로 선택받고 싶을 때 사용하면 좋습니다.
예: 당신이 소지한 카드들을 선택해 주세요.
form 에서:
<form name=f>
<input type=checkbox name="card_is[]" value="0x00001"> 삼성
<input type=checkbox name="card_is[]" value="0x00002"> LG
<input type=checkbox name="card_is[]" value="0x00004"> 현대
<input type=checkbox name="card_is[]" value="0x00008"> 국민
<input type=checkbox name="card_is[]" value="0x00010"> 외환
...
<input type=checkbox name="card_is[]" value="0x01000"> 경남
</form>
php에서:
<?
$arr_card = array(
0x00001 => '삼성카드',
0x00002 => 'LG카드',
0x00004 => '현대카드',
0x00008 => '국민카드',
0x00010 => '외환카드',
0x00020 => '한미카드',
0x00040 => '기업카드',
0x00080 => '하나카드',
0x00100 => '기타BC카드',
0x00200 => '전북카드',
0x00400 => '동아백화점카드',
0x00800 => '롯데백화점카드',
0x01000 => '경남카드'
);
//bit
function bit_get($_fld) {
global ${"$_fld"};
$fld = ${"$_fld"};
if(!is_array($fld)) {
${"$_fld"} = 0;
return 0;
}
$tmp = 0;
foreach($fld as $k=>$v) {
$tmp = $tmp | (0+$v);
}
${"$_fld"} = $tmp;
}
function bit_str($bit,$arr,$sep="") {
if(!is_array($arr)) return NULL;
$cnt = count($arr);
$b = 1; $str = ""; $cnt_match =0;
for($n=0;$n<$cnt;$n++) {
if($b & $bit) {
if($cnt_match>0)
$str .= $sep;
$str .= $arr[$b];
$cnt_match ++;
}
$b <<= 1;
}
return $str;
}
$card_is = bit_get("card_is"); // 원래의 변수를 다중 선택된 비트값의 변수로 재사용.
echo bit_str($card_is,$arr_card_is,$sep=",") // 선택한 카드를 , 로 구분하여 리턴.
?>
입력은 이렇게 받으면 되고, 수정할 때 다시 원래의 카드를 선택하는 건
아래 요령입니다.
<form name=f>
<input type=checkbox name="card_is[]" value="0x00001"
<?=(0x00001 & $card_is)?"checked":""?>> 삼성
<input type=checkbox name="card_is[]" value="0x00002"
<?=(0x00002 & $card_is)?"checked":""?>> LG
<input type=checkbox name="card_is[]" value="0x00004"
<?=(0x00003 & $card_is)?"checked":""?>> 현대
...
<input type=checkbox name="card_is[]" value="0x01000"
<?=(0x01000 & $card_is)?"checked":""?>> 경남
</form>
그렇다면 검색(목록에서..) 할 때는... ?
$find_card_is = 0x0001 | 0x0003 | 0x01000 ;
이 값은 삼성,lg,경남 카드 선택하는 것이구...
select * from table where card_is & $find_card_is;
이렇게 하시면, card_is 에 설정된 비트중 $find_card_is 의 비트와 하나라도 맞으면 찾아집니다.
select * from table where card_is & ~ $find_card_is;
--> 하나도 일치하지 않을 때.
select * from table where (card_is & $find_card_is) = $find_card_is;
--> 모두가 일치할 때.
-- jeon.
예: 당신이 소지한 카드들을 선택해 주세요.
form 에서:
<form name=f>
<input type=checkbox name="card_is[]" value="0x00001"> 삼성
<input type=checkbox name="card_is[]" value="0x00002"> LG
<input type=checkbox name="card_is[]" value="0x00004"> 현대
<input type=checkbox name="card_is[]" value="0x00008"> 국민
<input type=checkbox name="card_is[]" value="0x00010"> 외환
...
<input type=checkbox name="card_is[]" value="0x01000"> 경남
</form>
php에서:
<?
$arr_card = array(
0x00001 => '삼성카드',
0x00002 => 'LG카드',
0x00004 => '현대카드',
0x00008 => '국민카드',
0x00010 => '외환카드',
0x00020 => '한미카드',
0x00040 => '기업카드',
0x00080 => '하나카드',
0x00100 => '기타BC카드',
0x00200 => '전북카드',
0x00400 => '동아백화점카드',
0x00800 => '롯데백화점카드',
0x01000 => '경남카드'
);
//bit
function bit_get($_fld) {
global ${"$_fld"};
$fld = ${"$_fld"};
if(!is_array($fld)) {
${"$_fld"} = 0;
return 0;
}
$tmp = 0;
foreach($fld as $k=>$v) {
$tmp = $tmp | (0+$v);
}
${"$_fld"} = $tmp;
}
function bit_str($bit,$arr,$sep="") {
if(!is_array($arr)) return NULL;
$cnt = count($arr);
$b = 1; $str = ""; $cnt_match =0;
for($n=0;$n<$cnt;$n++) {
if($b & $bit) {
if($cnt_match>0)
$str .= $sep;
$str .= $arr[$b];
$cnt_match ++;
}
$b <<= 1;
}
return $str;
}
$card_is = bit_get("card_is"); // 원래의 변수를 다중 선택된 비트값의 변수로 재사용.
echo bit_str($card_is,$arr_card_is,$sep=",") // 선택한 카드를 , 로 구분하여 리턴.
?>
입력은 이렇게 받으면 되고, 수정할 때 다시 원래의 카드를 선택하는 건
아래 요령입니다.
<form name=f>
<input type=checkbox name="card_is[]" value="0x00001"
<?=(0x00001 & $card_is)?"checked":""?>> 삼성
<input type=checkbox name="card_is[]" value="0x00002"
<?=(0x00002 & $card_is)?"checked":""?>> LG
<input type=checkbox name="card_is[]" value="0x00004"
<?=(0x00003 & $card_is)?"checked":""?>> 현대
...
<input type=checkbox name="card_is[]" value="0x01000"
<?=(0x01000 & $card_is)?"checked":""?>> 경남
</form>
그렇다면 검색(목록에서..) 할 때는... ?
$find_card_is = 0x0001 | 0x0003 | 0x01000 ;
이 값은 삼성,lg,경남 카드 선택하는 것이구...
select * from table where card_is & $find_card_is;
이렇게 하시면, card_is 에 설정된 비트중 $find_card_is 의 비트와 하나라도 맞으면 찾아집니다.
select * from table where card_is & ~ $find_card_is;
--> 하나도 일치하지 않을 때.
select * from table where (card_is & $find_card_is) = $find_card_is;
--> 모두가 일치할 때.
-- jeon.
관련자료
-
링크
댓글 0
등록된 댓글이 없습니다.