Защо този оператор switch не връща, че 0 е в 0-100?

Информация

В момента правя система на ниво потребител за моя уебсайт. Имам колона с точки в моята таблица с потребители, която ще се увеличава за определени награди и етапи и т.н.

Проблем

Имам този оператор за превключване, който взема точките на потребителите и ги преобразува в ниво, което се връща. Но се казва, че "0" не е в опцията 0-100, а по-скоро в опцията 100-200.

function userLevel($points){

    switch ($points) {
        case ($points>=0 && $points<100):
            return 1; // Level 1
            break;
        case ($points>=100 && $points <200):
            return 2; // Level 2
            break;
        case ($points>=200 && $points<300):
            return 3; // Level 3
            break;
        case ($points>=300 && $points<400):
            return 4; // Level 4
            break;
    }

}

echo userLevel(0);

Имам чувството, че това е един от онези въпроси „Кодирахте твърде много за едно сядане“ и отговорът е точно пред мен, но просто не мога да го видя!


person Harry    schedule 11.11.2013    source източник
comment
случаите не могат да съдържат условия. той просто очаква една скаларна стойност.   -  person dan-lee    schedule 11.11.2013
comment
@DanLee Мисля, че това е законно за PHP.   -  person sroes    schedule 11.11.2013
comment
@DanLee Те могат да съдържат условия, но поведението не е това, което се очаква. Това, което се случи тук е, че 0 се третира като false. Първото условие съвпада и връща true, следователно не е нула. Второто е невярно и съвпада. Всеки от следващите случаи ще съвпадне, но се прекъсва при първия.   -  person Michael Berkowski    schedule 11.11.2013
comment
Ако искате да използвате switch по този начин, тогава трябва да го направите switch(true) и след това да имате случаи с условия, които стават истина или невярно.   -  person CBroe    schedule 11.11.2013
comment
превключвателят може да се използва само с цели числа, не и с условия. Ако искате да проверите условията, трябва да използвате оператори if.   -  person Realitätsverlust    schedule 11.11.2013
comment
@MichaelBerkowski Да, не това имах предвид. Може да съдържа условия, но това условие разбира се се оценява на true или false.   -  person dan-lee    schedule 11.11.2013


Отговори (3)


Тъй като използвате условията за вашите случаи, вероятно искате да включите TRUE:

function userLevel($points){

    switch (true) {
        case ($points>=0 && $points<100):
            return 1; // Level 1
            break;
        case ($points>=100 && $points <200):
            return 2; // Level 2
            break;
        case ($points>=200 && $points<300):
            return 3; // Level 3
            break;
        case ($points>=300 && $points<400):
            return 4; // Level 4
            break;
    }

}
person sroes    schedule 11.11.2013
comment
Този синтаксис е грозен и трябва да се обезсърчава - person Raphaël Malié; 11.11.2013
comment
Това е само твоето мнение - person sroes; 11.11.2013
comment
@RaphaëlMalié Трябва ми така, тъй като праговете на точките ще се променят, следователно не мога да го направя с алгоритъм. И благодаря sroes, приемам отговора сега. - person Harry; 11.11.2013

Причината е, че кодът ви става такъв

function userLevel($points){

    switch (0) {
        case (true):  // compare 0 to true
            return 1; // Level 1
            break;
        case (false):  // compare 0 to false 
            return 2; // Level 2
            break;
        case (false):
            return 3; // Level 3
            break;
        case (false):
            return 4; // Level 4
            break;
    }

}

echo userLevel(0);

Първият случай не съвпада, защото 0 != true

вторият случай съвпада, защото 0 == false

Следователно вторият вариант се изпълнява

както казаха други, използвайте true в превключвателя, така че след това да стане true == true като първи случай, което прави това изпълнение

person exussum    schedule 11.11.2013

Едно друго нещо, което можете да направите, за да премахнете много код за това, е просто да направите това

return floor(($points+100)/100);
person scrblnrd3    schedule 11.11.2013