За последние 24 часа нас посетили 22980 программистов и 1233 робота. Сейчас ищут 832 программиста ...

Почему так работает switch ?

Тема в разделе "PHP для новичков", создана пользователем Атм_Евгений, 9 июн 2020.

  1. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Всем привет!

    Ребята. подскажите, что не так делаю:
    Вот мой код:
    Код (Text):
    1. $count = count($table);
    2.     if ($count == 0) {
    3.         $count = 5;
    4.     }
    5.     else {
    6.         switch ($count) {
    7.             case $count <= 5:
    8.                 $count = 5;
    9.             break;
    10.             case $count >= 20:
    11.                 $count = 20;
    12.             break;
    13.         }
    14.     }
    В переменной $table массив, считаю количество элементов и, если элементов от 0 до 5, то переменная $count = 5; если элементов от 5 до 20, то $count = количеству элементов; если элементов более 20, то $count = 20. Если убираю оператор if/else, то при 0 элементов $ count приравнивается к 20. Почему то в операторе switch строка case $count <=5 не отрабатывает ноль!? Из-за этого мне пришлось вписать выше оператор if. Помогите разобраться???
    За ранее благодарю за ответ!
     
    #1 Атм_Евгений, 9 июн 2020
    Последнее редактирование: 9 июн 2020
  2. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Потому что switch так не работает, как ты ожидаешь.
    Читай доку, - там всё сказано.
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    switch (true) может помочь )))
    --- Добавлено ---
    на самом деле, в любой непонятной ситуации обращайся к официальной документации: https://www.php.net/manual/ru/control-structures.switch
     
  4. sewayek230

    sewayek230 Новичок

    С нами с:
    10 июн 2020
    Сообщения:
    1
    Симпатии:
    0
    Я не знаю,что вы пытаетесь сделать,что если $count равняется 10?

    Вот :
    Код (Text):
    1. $count = count($table);
    2.     if ($count < 5) {
    3.         $count = 5;
    4.     }
    5.     if($count > 20) {
    6.         $count = 20;
    7.         }
    8.     }
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Очевидно он пытается сделать вот это: заставить переменную оставаться в заданном "коридоре" значений.
    PHP:
    1. $count = max(5, min(20, $count));
     
  6. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Я остановился на этом варианте:
    Код (Text):
    1. $count = count($table);
    2.     if ($count > 5 and $count < 20) {
    3.         $size = $count;
    4.     }
    5.     elseif ($count >= 20) {
    6.         $size = 20;
    7.     }
    8.     else {
    9.         $size = 5;
    10.     }
     
  7. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
  8. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Я сделал до этого ответа, переделывать не буду. К тому же, в моем варианте в основном всегда будет первый if работать, а в вашем, я так понимаю, каждый раз будет мусолиться вся формула, тратя на это такты процессора...?
     
  9. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Атм_Евгений ага, аж устанет работать
    PHP:
    1. <?php
    2.  
    3. $first = microtime(true);
    4. $count = rand(0, 30);
    5.  
    6. if ($count > 5 and $count < 20) {
    7.     $size1 = $count;
    8. }
    9. elseif ($count >= 20) {
    10.     $size1 = 20;
    11. }
    12. else {
    13.     $size1 = 5;
    14. }
    15.  
    16. $size2 = max(5, min(20, $count));
    17.  
    18. $last = microtime(true);
    19.  
    20. echo $size1 . PHP_EOL;
    21. echo $size2 . PHP_EOL;
    22. $value = $last - $first;
    23. echo "Скрипт выполняется за: ".$value;
     
  10. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Проверил по отдельности, вариант
    Код (Text):
    1. $size=max(5,min(20,$count));
    работает медленнее почти всегда, иногда равны показания!
     
  11. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А какая версия php у вас?
     
  12. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Последняя сборка OpenServer, php 7.1.33
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Даже если есть разница в какие-то наносекунды, это не то место где можно реально сэкономить. Куда важнее читабельность.
     
  14. alexphp

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

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    Почему это не сделать проще, без всяких switch?
    PHP:
    1. if ($count > 20) $count = 20;
    2. if ($count < 5) $count = 5;