2015-01-13 9 views
1

두 개의 부울 변수 $products_changed$address_changed이 있습니다.switch 문에서 사용할 이항 연산자

가 나는 상태 각각에 대한 시각적 표시기 표시하려면 :

  • 모두
  • products_changed이 참 참을
  • address_changed은 현재 난

사실이다 하는 중 :

if ($products_changed && $address_changed) //if both have changed 
    { 
    //visual indicator for both 
    } 
    elseif ($products_changed) //only products changed 
    { 
    //visual indicator for products changed 
    } 
    elseif ($address_changed) //only address changed 
    { 
    //visual indicator for address changed 
    } 

내가 적용 할 수있는 논리 연산 연산자가 필요하며 두 연산이 모두 true이거나 둘 다 false 인 경우 결과에 포함됩니다. 그러나 하나만 사실이라면 - 나는 어느 것을 (첫 번째인지 두 번째인지) 알아야합니다.

내 코드를 리팩토링 할 방법이

:

const BOTH_CHANGED = 1, PRODUCTS_CHANGED = 2, ADDRESS_CHANGED = 3; 
//The numbers 1,2,3 are arbitrary, could be any numbers. 

$visual_indicator = $products_changed **SOME_OPERATOR** $address_changed; 

switch($visual_indicator) { 
    case BOTH_CHANGED: //display visual indicator for both changed 
    break; 
    case PRODUCTS_CHANGED: //display visual indicator for products changed 
    break; 
    case ADDRESS_CHANGED: //display visual indicator for address changed 
    break; 
} 

나는 내가 할 수있는 실현 :

$visual_indicator = (int)$products_changed * 10 + (int)$address_changed; 
//11 will be both changed, 10 will be products changed, 1 will be address changed 

그러나 나는 더 우아하고 가능한 기본 운영자를 찾고 있어요. 이것은 코드 중복성과 가독성을 줄이는 데 중요합니다. 물론 이것은 내 코드의 단순화 된 버전이므로 내 프로젝트에서는 이것이 더 의미가 있습니다.

도움 & 아이디어를 주시면 감사하겠습니다. 감사.

+0

'xor'? "하나 또는 다른 하나는 아니지만 둘 다"당신에게 "단 하나가 변경되었습니다"줄 것입니다. –

+0

@MarcB하지만 * 어느 것이 문제입니까? – Yani

답변

1

이 경우 비트 연산자를 사용합니다. 다음과 같은 것 :

<?php 

    // shift each option by 1 
    define('A', 1); 
    define('B', 1<<1); 
    define('C', 1<<2); 

    // combine opitons with bitwise or (|) 
    $c = A | C; 

    // compare with or'ed values to find the combination 
    switch ($c) { 
     case A: 
     print "A only\n"; 
     break; 
     case A|B: 
     print "A and B\n"; 
     break; 
     case A|C: 
     print "A and C\n"; 
     break; 
    } 

    // use bitwise and (&) to check if an option is present 
    if ($c & A) print "Has A\n"; 
    if ($c & B) print "Has B\n"; 
    if ($c & C) print "Has C\n"; 
관련 문제