티스토리 뷰

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

예: 당신이 소지한 카드들을 선택해 주세요.
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; 
              --> 모두가 일치할 때.

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

Kohana 3.2 Config 얻기..  (0) 2011.08.24
Kohana 3.2 Custom Error Page 만들기.  (1) 2011.08.24
PHP 비트 연산자 사용.  (0) 2011.07.17
HTTP 1.1의 Content Length와 Transfer Encoding  (0) 2011.07.11
PHP 알려지지 않은 트릭 몇가지  (0) 2011.06.30
PHP 데코레이터 패턴 !!!!  (0) 2011.06.14
댓글
댓글쓰기 폼