티스토리 뷰

비트 연산자 샘플 

폼에서 어떤 설정들을 다중으로 선택받고 싶을 때 사용하면 좋습니다.

예: 당신이 소지한 카드들을 선택해 주세요. 
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.


'웹개발 > Php' 카테고리의 다른 글

뒤로가기 하더라도 데이터가 살아남기  (0) 2014.02.25
금지어 필터링  (0) 2014.02.25
배열 카운트 만큼 특수 문자 채우기  (0) 2014.02.25
셰션 정리하기  (0) 2014.02.19
php 세션 조절하기 방법  (0) 2014.02.19
댓글
댓글쓰기 폼