За последние 24 часа нас посетили 17502 программиста и 1686 роботов. Сейчас ищут 875 программистов ...

проблемы в switch с нулем

Тема в разделе "PHP для новичков", создана пользователем maxmimko, 14 авг 2011.

  1. maxmimko

    maxmimko Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    23
    Симпатии:
    0
    PHP:
    1. <?php
    2. $life=0;
    3. $healt=-1;
    4. $work=-6;  
    5.  
    6.     switch ($life)
    7.     {   case ($life >= 4):      $v[] = 'life';  $vv++;  break;
    8.         case ($life <= - 4):    $k[] = 'life';  $vk++;  break;
    9.         default:                     $n[] = 'life';  $nz++;  }
    10.     switch ($healt)
    11.     {   case ($healt >= 4):     $v[] = 'healt'; $vv++;  break;
    12.         case ($healt <= - 4):   $k[] = 'healt'; $vk++;  break;
    13.         default:                       $n[] = 'healt'; $nz++;  }
    14.     switch ($work)
    15.     {   case ($work >= 4):      $v[] = 'work';  $vv++;  break;
    16.         case ($work <= - 4):    $k[] = 'work';  $vk++;  break;
    17.         default:                        $n[] = 'work';  $nz++;  }
    18.        
    19.        for ($i=0; $i<3; $i++)
    20.        {
    21.        echo "result v: ".$v[$i]."<br>";
    22.        echo "result k: ".$k[$i]."<br>";
    23.        echo "result n: ".$n[$i]."<br>"."<br>";
    24.        }
    25. ?>
    Выдает:
    result v: life
    result k: work
    result n: healt

    Ноль почему-то считает >= 4.

    В чем проблема?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    через ифы делай и усё
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Потому что неправильно используешь switch.
    PHP:
    1. <?php
    2. $a = 3;
    3. switch($a) {
    4. case 1:
    5.     echo('1');
    6.     break;
    7. case 2:
    8.     echo('2');
    9.     break;
    10. case 3:
    11.     echo('3');   // Это сработает
    12.     break;
    13. default:
    14.     echo('default');
    15. }
    16. ?>
    switch - case сравнивает выражение, которое стоит в скобочках после switch с выражением, которое стоит после case до тех пор пока не найдёт совпадения, иначе (совпадений нет) - выполнится default. Т.е. что получается: сравнивается выражение $life (содержит 0) c выражением ($life >= 4). Т.к. $life = 0, то (0 >= 4) === false. Сравнивается 0 и false. Т.к. в php есть автопреобразование типов, 0 преобразуется в false, и результат сравнения даёт true (false == false -> true) и выполняется блок
    Код (Text):
    1. $v[] = 'life';  $vv++;
     
  4. maxmimko

    maxmimko Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    23
    Симпатии:
    0
    igordata, sobachnik - спасибо парни, вы настоящие альтруисты! Сидеть тут читать топики новичков, которые не могут разобраться сами, да еще и помогать советами - это стоит уважения!

    А как же тогда правильно? Раз есть это автопреобразование, то с нулем у меня ничего не выйдет?
     
  5. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Они мои кумиры! [​IMG]
    [​IMG]
     
  6. maxmimko

    maxmimko Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    23
    Симпатии:
    0
    Думал очень много места сэкономлю с использованием switch.
    Но если подредактировать, то и через if довольно аккуратно получается.
    PHP:
    1. <?php
    2.     $life=0;    $healt=0;   $work=0;  
    3.  
    4.     if      ($life>=4)        {$v[] = 'life'; $vv++;}
    5.     elseif  ($life <= - 4)  {$k[] = 'life'; $vk++;}
    6.     else                         {$n[] = 'life'; $nz++;}
    7.    
    8.     if      ($healt >= 4)     {$v[] = 'healt'; $vv++;}
    9.     elseif  ($healt <= - 4) {$k[] = 'healt'; $vk++;}
    10.     else                          {$n[] = 'healt'; $nz++;}
    11.  
    12.     if      ($work >= 4)      {$v[] = 'work';  $vv++;}
    13.     elseif  ($work <= - 4)  {$k[] = 'work';  $vk++;}
    14.     else                           {$n[] = 'work';  $nz++;}
    15.    
    16.     for ($i=0; $i<3; $i++)
    17.     {
    18.     echo "result v: ".$v[$i]."<br>";
    19.     echo "result k: ".$k[$i]."<br>";
    20.     echo "result n: ".$n[$i]."<br>"."<br>";
    21.     }
    22. ?>
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    maxmimko
    спасибо, чел. прям слезы на глазах. а ты в какой программе скртпты пишешь?
     
  8. maxmimko

    maxmimko Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    23
    Симпатии:
    0
    php desinger7
     
  9. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    а зачем его экономить? не печатать же исходиники будете.