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?

È stato utile?

Soluzione

Cambia switch ($ level) in switch (true) e funzionerà.

Le

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...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top