PHP & Others

비트연산으로 다중값 처리하기

컨텐츠 정보

본문

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

예: 당신이 소지한 카드들을 선택해 주세요.
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
등록된 댓글이 없습니다.
Today's proverb
어떤 말을 만번 이상 되풀이 하면 반드시 미래에 그 일이 이루어진다. (아메리카 인디언 금언)