2009-11-26 32 views
6

Tôi không hiểu điều gì đang xảy ra ở đây. Về mặt logic, nó không có ý nghĩa với tôi.Tuyên bố CASE của PHP không hoạt động với các giá trị ZERO

<?php 
$level = 0; 

switch ($level) { 

    case $level > 80: $answer = 'high'; break; 
    case $level > 60: $answer = 'moderate-to-high'; break; 
    case $level > 40: $answer = 'moderate'; break; 
    case $level > 20: $answer = 'low-to-moderate'; break; 
    default: $answer = 'low'; break; 
} 
echo $answer; 
?> 

Khi $ level == 0, trả về "cao". Điều này không có ý nghĩa với tôi. Ai đó có thể giải thích những gì đang xảy ra ở đây?

Trả lời

26

Thay đổi switch ($level) thành switch (true) và thao tác này sẽ hoạt động.

switch câu lệnh thực hiện kiểm tra bình đẳng về giá trị trong các trường hợp. PHP đang đánh giá các so sánh > của bạn, vì vậy case $level > 80 sẽ trở thành case false. false được coi là bằng 0, vì vậy trường hợp đầu tiên khớp với nhau.

+2

Điều này rất có ý nghĩa với tôi bây giờ. Tôi đã có một sự hiểu lầm cơ bản trong cách chuyển đổi công trình. Cảm ơn sự giáo dục! – pbarney

+0

@pbamey, yup, câu trả lời hay, tôi đồng ý, vì vậy hãy chấp nhận và cho Phil mượn. – Don

+4

Tôi không chắc chắn nếu điều này sẽ được đề nghị phương pháp tiếp cận của việc sử dụng một tuyên bố chuyển đổi mặc dù, tôi sẽ không nói nó đọc rất tốt. –

5

Số lượng sau case cần chỉ là giá trị, không phải là biểu thức logic. Tôi đoán rằng PHP đang đánh giá case $level > 80case ($level > 80) đang trở thành case 0 (tức là sai, vì $level thực sự KHÔNG nhỏ hơn 80) và do đó bạn khớp với trường hợp đầu tiên.

0

Bạn có chắc chắn bạn có thể làm điều này trong php không?

Tôi vừa kiểm tra manual of switch và bạn phải cung cấp giá trị khác biệt.

Tôi nghĩ rằng nếu bạn có thể viết lại thành một cái gì đó như:

$levelDivTwenty = intval($level/20); 
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty; 

và sau đó trường hợp về điều đó.

switch ($levelDivTwenty) { 
    case 4: //same as $level > 80 before... 
    case 3: //>60 etc... 
} 
1

Như những người khác đã chỉ ra bạn không thể sử dụng switch như vậy, nhưng làm thế nào về việc xác định nó như thế này:

<? 
$level = 21; 
$answers = array('low', 'low-to-moderate', 
       'moderate', 'moderate-to-high', 'high'); 

echo $answers[intval(($level-1)/20)]; 
?> 

Note: Nếu $ mức = 0, sau đó biểu thức bên trong intval() sẽ là -1/20, nhỏ hơn -1 và do đó sẽ được làm tròn thành 0.

+0

đó là một cách tiếp cận thú vị – pbarney

1

Đây không phải là cách chuyển đổi dự định được sử dụng. Đó là để đánh giá cho một giá trị cụ thể.

Sử dụng If/else nếu ở đây, thay vì làm phức tạp cuộc sống của bạn để làm cho công tắc hoạt động như một.

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