티스토리 뷰

웹개발/Php

비트 연산자 처리 샘플

야쿠 yaku 2014.02.25 21:55

비트 연산자 샘플 

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

예: 당신이 소지한 카드들을 선택해 주세요. 
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.25
셰션 정리하기  (0) 2014.02.19
php 세션 조절하기 방법  (0) 2014.02.19
댓글
댓글쓰기 폼