0 в случае переключателя? - PullRequest
8 голосов
/ 14 февраля 2010

Извините за возможно глупый вопрос, но у меня ОГРОМНАЯ проблема с одним случаем, когда у меня есть некоторая переменная типа int со значением 0 (ноль).

            switch ($starost_vozila){
                case (0):
                    switch ($podaci['tip_motora']){
                        case ("motor1"):
                            $eko_taksa = 485;
                        break;
                        case ("motor2"):
                            $eko_taksa = 243;
                        break;
                        case ("motor3"):
                            $eko_taksa = 121;
                        break;
                        case ("motor4"):
                            $eko_taksa = 194;
                        break;
                    }
                break;
                case ($starost_vozila < 6):
                    switch ($podaci['tip_motora']){
                        case ("motor1"):
                            $eko_taksa = 485;
                        break;
                        case ("motor2"):
                            $eko_taksa = 243;
                        break;
                        case ("motor3"):
                            $eko_taksa = 121;
                        break;
                        case ("motor4"):
                            $eko_taksa = 194;
                        break;
                    }
                break;
                case ($starost_vozila > 5 && $starost_vozila < 11):
                    switch ($podaci['tip_motora']){
                        case ("motor1"):
                            $eko_taksa = 667;
                        break;
                        case ("motor2"):
                            $eko_taksa = 273;
                        break;
                        case ("motor3"):
                            $eko_taksa = 136;
                        break;
                        case ("motor4"):
                            $eko_taksa = 218;
                        break;
                    }
                break;

Переключение продолжайте больше, но вот моя проблема, в этом фрагменте кода.

Если я не ставлю «case (0):» и использую это:

case ($starost_vozila >= 0 && $starost_vozila < 6):

Тогда следующий случай каким-то образом станет активным, и он напечатает, что "$ eko_taksa = 667;".

Это все проблема, когда «$ starost_vozila = 0», но когда это число меньше 6, чем этот случай выше.

Каждый вар здесь int. Все работает нормально, кроме случаев, когда "$ starost_vozila = 0" и когда я использую"case ($ starost_vozila> = 0 && $ starost_vozila <6):". </p>

Понятия не имею, что происходит ... Оо

Извините, если это тупой вопрос. (

Ответы [ 3 ]

8 голосов
/ 14 февраля 2010

случаи переключения не принимают операторов, которые должны быть оценены. Они берут простые строки, логические значения или числа для сравнения с

скажем, у вас есть

$x = 0

switch( $x ) {
    case( $x < 10 ):
    ...
    break;
}

вы ожидаете, что дело будет запущено, но это не так, и вот почему

( $x < 10 ) оценивается как true так что у вас есть:

$x = 0

switch( $x ) {
    case true: //!!!
    ...
    break;
}

0 != true так что дело не получается

вам нужно использовать

if() {

} else if() {

} else {

}
3 голосов
/ 14 февраля 2010

Вы используете switch неправильно.

Ваш код понимается так:

if ($starost_vozila == 0) {
    switch ($podaci['tip_motora']){
        case ("motor1"):
            $eko_taksa = 485;
        break;
        case ("motor2"):
            $eko_taksa = 243;
        break;
        case ("motor3"):
            $eko_taksa = 121;
        break;
        case ("motor4"):
            $eko_taksa = 194;
        break;
    }
} else if ($starost_vozila == ($starost_vozila < 6)) { //not what you want!!!
    switch ($podaci['tip_motora']){
        case ("motor1"):
            $eko_taksa = 485;
        break;
        case ("motor2"):
            $eko_taksa = 243;
        break;
        case ("motor3"):
            $eko_taksa = 121;
        break;
        case ("motor4"):
            $eko_taksa = 194;
        break;
    }
} else if ($starost_vozila == ($starost_vozila > 5 && $starost_vozila < 11)) { //not what you want!!!
    switch ($podaci['tip_motora']){
        case ("motor1"):
            $eko_taksa = 667;
        break;
        case ("motor2"):
            $eko_taksa = 273;
        break;
        case ("motor3"):
            $eko_taksa = 136;
        break;
        case ("motor4"):
            $eko_taksa = 218;
        break;
    }
}

Например, ($starost_vozila < 6) станет либо TRUE, либо FALSE. $starost_vozila == ($starost_vozila < 6) сравнивает $starost_vozila с TRUE или FALSE, а это не то, что вы хотите сделать.

Я предлагаю использовать if / elseif вместо switch в этом случае. Например:

if ($starost_vozila == 0) {
    ...
} else if ($starost_vozila < 6) {
    ...
} else if ($starost_vozila > 5 && $starost_vozila < 11) {
    ...
}
0 голосов
/ 14 февраля 2010

использование Switch похоже на == в «операторе if», а не === (не проверяет тип). Только пустая строка или NULL приведут к целому числу 0 - кроме этого, они считаются строкой 0.

...