2012-01-30 21 views
8

Nếu tôi có các phép toán sauĐảm bảo chính xác một boolean của danh sách đã cho là đúng?

const YESTERDAY = false; 
const TODAY = true; 
const TOMORROW = false; 

đang Những gì tôi có thể viết để đảm bảo chính xác một là đúng?

Tôi đã thử điều này:

$x = self::YESTERDAY^self::TODAY^self::TOMORROW; 

Vấn đề là với cả ba hằng số thiết lập để true sau đó $xtrue.

+0

bạn có thể đặt tất cả kết hợp sử dụng điều kiện OR '(YESTERDAY = true AND TODAY = false AND TOMORROW = false) hoặc (YESTERDAY = false AND TODAY = true AND TOMORROW = false) hoặc (YESTERDAY = false AND TODAY = false AND TOMORROW = true) ' –

+0

Anh ấy cần phải chắc chắn rằng sự thật là MỘT TUYỆT VỜI MỘT, không phải TRƯỚC MỘT. – devdRew

Trả lời

8

$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW); Sau đó, nếu $x === 1; Bạn có những thứ mình cần.

EDITED:

Thậm chí không có loại phôi (int), nó hoạt động tốt, nhờ @DaveRandom, vì vậy:

if (self::YESTERDAY + self::TODAY + self::TOMORROW == 1) {}, như đối với tôi.

+0

Tôi đã nghĩ về điều này nhưng tốt hơn hết là nên tránh tất cả những xử lý bổ sung đó, có cách nào để làm điều này không? – Matthew

+0

+1 điều này - có vẻ như sau khi thử nghiệm mà bạn thậm chí không cần phôi (')', nó xảy ra ngầm. – DaveRandom

+1

Điều này là gọn gàng hơn bất kỳ giải pháp nào khá[email protected] đã gần như chính xác trong việc sử dụng toán tử XOR (^), nhưng tiếc là 'true^true^true' sẽ đánh giá' true', vì PHP diễn giải nó là '(true^true)^true', tức là' false^true ' – WildlyInaccurate

0

Cũng giống như một thay thế cho câu trả lời devdRew của

$x = array_count_values(array((int) self::YESTERDAY,(int) self::TODAY,(int) self::TOMORROW)); 
if (isset($x[1]) && $x[1] == 1) { 
    echo 'Only one TRUE'; 
} 
2

Cách neatest tôi có thể nghĩ đến là array_sum():

if (array_sum(array(self::YESTERDAY, self::TODAY, self::TOMORROW)) == 1) { 
    // Do something 
} 

EDIT Trên thực tế, tất cả các bạn cần phải làm điều đó thay thế ^ với + trong nỗ lực ban đầu của bạn và đạt được điều tương tự:

$x = self::YESTERDAY + self::TODAY + self::TOMORROW; 

Điều này chuyển thành số TRUE giá trị $x. Vì vậy, đối với một sử dụng đầu ra boolean:

$ok = self::YESTERDAY + self::TODAY + self::TOMORROW === 1; 
+0

khá gọn gàng! – Matthew

+0

Trên thực tế, một biến thể trên câu trả lời của devdRew là gọn gàng nhất - nếu bạn chỉ thay thế '^' bằng '+' trong mã ban đầu của bạn, nó sẽ làm điều tương tự - bạn không cần các phôi '(int)' khi điều này xảy ra ngầm định. – DaveRandom

+0

thậm chí còn neater! – Matthew

0

Bạn có thể lặp trên một danh sách các biến của bạn và phá vỡ khi bạn tìm thấy một boolean thứ hai đó là sự thật:

$moreThanOneTrue=false; 
$oneTrue; 
foreach ($BOOL_VAR_ARRAY as $bool) { 
    if ($bool) { 
     if($oneTrue) { 
      $moreThanOneTrue=true; 
      break; 
     } 
     $oneTrue=true; 
    } 
} 

Như thế này rất thuận tiện hơn khi bạn có nhiều hơn ba biến.

+0

Nếu có nhiều hơn 3 tôi nghĩ phương thức 'array_sum' sẽ đơn giản hơn – Matthew

+0

@Matt: Tôi đồng ý .. – ezdazuzena

0

x sẽ trả về giá trị đúng nếu và chỉ khi một là đúng và các giá trị khác sai.

$x = ($a && !($b || $c)) || ($b && !($a || $c)) || ($c && !($a || $b)); 

Có thể là mã không hợp lệ nhưng hoạt động.

0

a^b^c^(a & b & c) là ví dụ mà bạn tìm kiếm.

Các vấn đề liên quan