Istruzione CASE PHP non funzionante con valori ZERO
-
05-07-2019 - |
Domanda
Non capisco cosa sta succedendo qui. Logicamente, non ha alcun senso per me.
<?php
$level = 0;
switch ($level) {
case $level > 80: $answer = 'high'; break;
case $level > 60: $answer = 'moderate-to-high'; break;
case $level > 40: $answer = 'moderate'; break;
case $level > 20: $answer = 'low-to-moderate'; break;
default: $answer = 'low'; break;
}
echo $answer;
?>
Quando $ livello == 0, restituisce "alto". Questo non ha alcun senso per me. Qualcuno può spiegare cosa sta succedendo qui?
Soluzione
Cambia switch ($ level)
in switch (true)
e funzionerà.
le istruzioni switch
eseguono test di uguaglianza sui valori nei casi. PHP sta valutando i tuoi confronti >
, quindi case $ level > 80
diventa case false
. false
è considerato uguale a 0
, quindi il primo caso corrisponde.
Altri suggerimenti
La quantità dopo il case
deve essere solo il valore, non un'espressione booleana. Suppongo che PHP stia valutando case $ level > 80
come case ($ level > 80)
che sta diventando case 0
(cioè falso, poiché $ level
è effettivamente NON meno di 80) e quindi stai abbinando il primo caso.
Come altri hanno sottolineato, non puoi usare switch in questo modo, ma che ne dici di definirlo in questo modo:
<?
$level = 21;
$answers = array('low', 'low-to-moderate',
'moderate', 'moderate-to-high', 'high');
echo $answers[intval(($level-1)/20)];
?>
Nota : Se $ livello = 0 , allora l'espressione all'interno di intval () sarà -1/20 , che è inferiore a -1 e pertanto verrà arrotondato a 0 .
Questo non è davvero il modo in cui switch è destinato a essere utilizzato. È valutare per un valore specifico.
Usa un If / else se qui, invece di complicare la tua vita per far funzionare un interruttore come uno.
Sei sicuro di poterlo fare in php?
Ho appena controllato il manuale dello switch e tu deve fornire un valore distinto.
Penso che se riesci a riscriverlo in qualcosa del tipo:
$levelDivTwenty = intval($level/20);
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty;
e poi caso su questo.
switch ($levelDivTwenty) {
case 4: //same as $level > 80 before...
case 3: //>60 etc...
}