Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Конструкция switch-case или elseif лучше?
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Конструкция switch-case или elseif лучше?

Страниц (1): [1]
 

1. Конструктор - 05 Апреля, 2011 - 20:01:54 - перейти к сообщению
Всем добрый утро..
Есть 2 вопроса:
1. Почему при $d=0 , скрипт выводит следующее-->
Дискриминант равен 0
действительных решений нет
x1=-2
x2=-2
почему он думает что $d<0?

2. И еще вопрос в чем отличие этой конструкции switch() case:..
от elseif?
В каких случаях что лучше использоваь?

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $a = 2;
  3. $b = 8;
  4. $c = 5;
  5. //$d = $b * $b - 4 * $a * $c;
  6. $d=0;
  7.  
  8. echo "Дискриминант равен $d <br>";
  9.  
  10. switch ($d)
  11. {
  12.         case ($d<0): echo 'действительных решений нет <br>'; break;
  13.        
  14.         case ($d==0): echo 'решение 1 <br>'; break;
  15.        
  16.         case ($d>0): echo 'существуют 2 решения <br>'; break;
  17. }
  18. $x1 = (-$b + sqrt ($d))/2/$a;
  19. echo "x1=$x1 <br>";
  20.  
  21. $x2 = (-$b - sqrt ($d))/2/$a;
  22. echo "x2=$x2 <br>";
  23. ?>
2. valenok - 05 Апреля, 2011 - 20:07:25 - перейти к сообщению
Потому, что конструкция switch работает немного по другому.
Она сравнивает аргумент $d с тем, что написано в скобочках.
Тоесть происходит три сравнения
1. $d == ($d<0) что у него переводится в (false == false) = true и поэтому исполняется это
2. $d == ($d == 0)
3. $d == ($d >0)

можно сделать к примеру так
switch(true):
case ($d>0): break;
case ($d==0): break;
case ($d<0): break;
endswitch;

но лучше использовать в данном случае elseif так как у тебя всего три варианта и в одном из них нужно вовсе прекратить выполнение скрипта.
3. Конструктор - 05 Апреля, 2011 - 20:21:04 - перейти к сообщению
valenok пишет:
Она сравнивает аргумент $d с тем, что написано в скобочках.

Понятно , вроде работает как надо..

Тоесть если логические варианты нужно в скобках писать true,
а если варианты - числа, то будет-->
switch $x
{
case 1: ..;
case 34: ..;
case 5878: ..;
}

И всеже хотел еще спросить что эффективнее работает? или серверу все равно?
Пока прихожу к выводу что если варианты числа то надо - switch - case..
если логика - то if.. elseif...;
это так? и если ли еще аргументы в пользу какого-то способа?
4. valenok - 05 Апреля, 2011 - 20:50:41 - перейти к сообщению
if else позволяет проверять более сложные условия, по несколько за раз и в разных вариациях, когда делает лишь простые сравнения, но много за раз.

 

Powered by ExBB FM 1.0 RC1