2017-10-25 30 views
5

Tôi có một câu lệnh chuyển đổi để hiển thị điểm dựa trên số điểm mà học sinh nhận được.Trả lại giá trị sai

sinh viên với điểm> = 80 có được Một
sinh viên với điểm> = 70 get B
sinh viên với điểm> = 50 có được C
sinh viên với điểm> = 30 get D
sinh viên với điểm> = 0 nhận E

Vấn đề là khi điểm là 0, nó trả về A thay vì E. Đây là câu lệnh switch.

$point = 0; 
switch ($point) { 
     case $point >= 80: 
      echo 'A'; 
      break; 
     case $point >= 70: 
      echo 'B'; 
      break; 
     case $point >= 50: 
      return 'C'; 
      break; 
     case $point >= 30: 
      echo 'D'; 
      break; 
     case $point >= 0: 
      echo 'E'; 
      break; 
     default: 
      echo 'F'; 
      break; 
    } 
+2

có thể trùng lặp của [tuyên bố CASE PHP không làm việc với ZERO giá trị] (https : // stackoverflow.com/questions/1800798/php-case-statement-not-working-with-zero-values) –

+1

nếu bạn 'var_dump ($ point> = 80)' của nó 'false' và' false' được coi là '0' để trước tiên trường hợp được so khớp bất kể điều kiện logic. –

Trả lời

5

Bạn cố gắng so sánh $point đến một giá trị boolean (như $point >= 80). Nó khớp với trường hợp đầu tiên bởi vì $point = 0 là sai và $point >= 80 cũng sai, vì vậy nó khớp với trường hợp đầu tiên và lặp lại A. Nếu bạn muốn sử dụng một so sánh về các trường hợp bạn phải sử dụng đoạn mã sau:

$point = 0; 

switch (true) { 
    case $point >= 80: 
     echo 'A'; 
     break; 
    case $point >= 70: 
     echo 'B'; 
     break; 
    case $point >= 50: 
     echo 'C'; 
     break; 
    case $point >= 30: 
     echo 'D'; 
     break; 
    case $point >= 0: 
     echo 'E'; 
     break; 
    default: 
     echo 'F'; 
     break; 
} 

demo:https://ideone.com/lyBUmA

Một giải pháp khác sử dụng ifelseif thay vì switch:

$point = 0; 

if ($point >= 80) { 
    echo 'A'; 
} elseif ($point >= 70) { 
    echo 'B'; 
} elseif ($point >= 50) { 
    echo 'C'; 
} elseif ($point >= 30) { 
    echo 'D'; 
} elseif ($point >= 0) { 
    echo 'E'; 
} else { 
    echo 'F'; 
} 

demo:https://ideone.com/FRlorS

0

Bạn có thể sử dụng 2 so sánh trong trường hợp như:

case $point >= 80: 
    echo 'A'; 
    break; 
case ($point < 80 && $point >= 70): 
    echo 'B'; 
    break; 

và vân vân ..

1

này sẽ không làm việc, bạn cố gắng sử dụng điều kiện boolean. Sử dụng nếu khác thay vì nó.

+0

có, nếu người khác đang làm việc tốt – Abaij

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ review/low-quality-posts/17729035) – Krumia

1

có hiển nhiên câu hỏi này là trùng lặp. thay vì sử dụng

switch ($ điểm)

bạn nên sử dụng

switch (true)

và nó hoạt động i kiểm tra

<?php 
$point = 0; 
switch (true) { 
    case $point >= 80: 
     echo 'A'; 
     break; 
    case $point >= 70: 
     echo 'B'; 
     break; 
    case $point >= 50: 
     return 'C'; 
     break; 
    case $point >= 30: 
     echo 'D'; 
     break; 
    case $point >= 0: 
     echo 'E'; 
     break; 
    default: 
     echo 'F'; 
     break; 
} 

để biết thêm chi tiết xin vui lòng kiểm tra this question

0

Switch/Trường hợp không hỗ trợ> ... Hãy thử nếu/elseif ....

$point = 0; 


if ($point >= 80) 
    echo 'A'; 
elseif ($point >= 70) 
    echo 'B'; 
elseif ($point >= 50) 
    echo 'C'; 
elseif ($point >= 30) 
    echo 'D'; 
elseif ($point >= 0) 
    echo 'E'; 
else 
    echo 'F'; 
+0

Cũng lưu ý rằng bản gốc của bạn có một lỗi kỳ lạ ở giữa có chữ "return 'C'" thay vì "echo 'C'". – Todd

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