Pagina 1 di 2

Curiosità sulla istruzioni switch di PHP

Inviato: ven 30 gen 2009, 22:45
da samiel
Avendo una cosa del tipo:

Codice: Seleziona tutto

$temperatura = 35;
switch ($temperatura) {
case 30:
case 31:
case 32:
case 34:
case 35:
echo "Gelido <br>";
c'è modo di indicare un range di case
per non scrivere tutte le righe dei vari case?

Grazie!
M.

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 1:18
da giberg
Prova a dare uno sguardo
agli esempi inseriti nei commenti
degli utenti nella pagina http://it2.php.net/switch
dovresti trovare qualcosa di
interessante su vari modi di costruire
i case. Adatta al tuo caso
(quindi per te il case dovrà essere "valore della
variabile $temperatura compreso tra 30 e 35").

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 7:54
da aschenaz
In questi casi, forse scrivi meno codice con un bel if.

Magari, se i valori sono tanti, crei un array e poi metti in_array come
condizione:

Codice: Seleziona tutto

$temperatura=35;
$temperature=array(30,31,32,34,35);
echo in_array($temperatura,$temperature) ? "gelido" : "tiepido";
Ciao,
nino

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 15:21
da teox99
la migliore e' utilizzare degli elseif.

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 17:01
da samiel
Grazie delle risposte. Un utente (tale fteng1) proprio in quella pagina scrive però
che "in PHP this is accomplished by using the "case" identifier for each condition".
E infatti ricorre, per testare un case con condizioni multiple di uguale risultato, ricorre
agli arrai, come suggerito da nino. Mi stupisce un po' che non si sia pensato
a un costrutto diretto per questo tipo di situazioni. Forse ci sarà un motivo, boh...

Grazie
M.

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 17:59
da giberg
Ma hai provato a fare qualcosa
del tipo
case ($temperatura>=30 and $temperatura<=35)

per vedere se funziona?

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 18:37
da teox99
samiel ha scritto: Mi stupisce un po' che non si sia pensato
a un costrutto diretto per questo tipo di situazioni. Forse ci sarà un motivo, boh...
MA il costrutto diretto per questo tipo di situazione si chiama "ELSEIF"!!! se poi non ti piace e' un'altra storia...
$t = 35;

if ($t <= 20 ££ $t <= 24) { echo "freddo";
} elseif ($t <= 25 ££ $t <= 30) { echo "quasi freddo";
} elseif ($t <= 31 ££ $t <= 32 ) { echo "verso il freddo"
} elseif ($t <= 33 ££ $t <= 34) { echo "caldo":
...
} else { echo "molto caldo"; }

risultato "molto caldo"

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 19:44
da nuitari
puoi usare una forma tipo questa:

Codice: Seleziona tutto

<?php
$test = 5;

switch (true)
{
	case ($test > 3 && $test < 8):
		echo "> 3 < 8";
		break;
		
	case ($test > 3):
		echo ">3";
		break;
		
	case ($test < 8):
		echo "<8";
		break;
		
	default:
		echo "default";
}
?> 
con $test = 5 come nell'esempio si ferma al primo case. Variando il valore di test (o mettendo false al posto di true nello switch) puoi fare un po' di prove.
Ricorda che i case sono verificati in sequenza e trovato un riscontro il check si ferma, per cui dovresti mettere il più restrittivo come primo e via dicendo.

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 21:02
da aschenaz
teox99 ha scritto:
samiel ha scritto: Mi stupisce un po' che non si sia pensato
a un costrutto diretto per questo tipo di situazioni. Forse ci sarà un motivo, boh...
MA il costrutto diretto per questo tipo di situazione si chiama "ELSEIF"!!! se poi non ti piace e' un'altra storia...
$t = 35;

if ($t <= 20 ££ $t <= 24) { echo "freddo";
} elseif ($t <= 25 ££ $t <= 30) { echo "quasi freddo";
} elseif ($t <= 31 ££ $t <= 32 ) { echo "verso il freddo"
} elseif ($t <= 33 ££ $t <= 34) { echo "caldo":
...
} else { echo "molto caldo"; }

risultato "molto caldo"
Di fatto, il semplice costrutto che ho suggerito io, era una condizione if-else.
Uno degli obiettivi della programmazione IMHO dovrebbe essere "ottenere
gli stessi risultati con un minor uso di codice" (a meno che non ti paghino
un tanto alla riga, come certi programmatori che conosco io :lol: ).
Come dici tu, rischi di dover riempire una pagina quando potresti risolvere
con due o tre righe...

Inoltre, non credi che dovrebbe essere & e non £?

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 23:37
da targzeta
aschenaz ha scritto:...

Codice: Seleziona tutto

$temperatura=35;
$temperature=array(30,31,32,34,35);
echo in_array($temperatura,$temperature) ? "gelido" : "tiepido";
...
E se poi devi fare un altra cosa per i valori tra 40 e 50 che fai? Crei un altro array, e fai un altro if? E se poi ancora devi fare altro per i valori tra....

Spina

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 23:41
da targzeta
teox99 ha scritto:...
if ($t <= 20 ££ $t <= 24)
...
A parte l'££ che dovrebbe essere &&, ma un numero inferiore a 20 non credi sia anche inferiore a 24? Lo stesso vale anche per le altre espressioni che non ho citato.

Spina

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 23:44
da teox99
esatto Spina, centrato in pieno, aschenaz propone una valida alternativa ma le righe di codice sono pressoche' le stesse di un comune e secondo me molto piu' azzeccato se non piu' semplice elseif!

mi sono sbagliato volevo scrivere && :D

ok, faccio ammenda, ho scritto veramente male ho una mini tastiera con layout uk e ancora devo abituarmi di seguito la correzione:

if ($t < 20 ) { echo "molto freddo";
} elseif ($t >= 20 && $t <= 24) { echo "freddo";
} elseif ($t >= 25 && $t <= 30) { echo "quasi freddo";
} elseif ($t >= 31 && $t <= 32 ) { echo "verso il freddo"
} elseif ($t >= 33 && $t <= 34) { echo "caldo":
...
} else { echo "molto caldo"; }

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 23:48
da targzeta
nuitari ha scritto:...

Codice: Seleziona tutto

<?php
$test = 5;

switch (true)
{
	case ($test > 3 && $test < 8):
		echo "> 3 < 8";
		break;
		
	case ($test > 3):
		echo ">3";
		break;
		
	case ($test < 8):
		echo "<8";
		break;
		
	default:
		echo "default";
}
?> 
...
Anche a me piace questa soluzione (la prendo per funzionante visto che l'hai scritta), rende il codice più leggibile. Però anche qui, un numero o appartiene all'intervallo (3,8) o all'intervallo (-inf, 3] o all'intervallo [8,+inf), quindi il secondo case dovrebbe essere (>=8) e non (>3) e il terzo (<=3) e non (<8), non trovi?
nuitari ha scritto:...
Ricorda che i case sono verificati in sequenza e trovato un riscontro il check si ferma...
Più precisamente è il break che interrompe lo switch!

Spina

Re: Curiosità sulla istruzioni switch di PHP

Inviato: sab 31 gen 2009, 23:55
da targzeta
teox99 ha scritto:...
ok, faccio ammenda
...
Macché, anzi, ne approfitto chiedere scusa a tutti se sono risultato un pò odioso con queste mie sentenze.

Spina

Re: Curiosità sulla istruzioni switch di PHP

Inviato: dom 1 feb 2009, 0:10
da samiel
Non è che elseif non mi piace, è che nei manuali switch è presentato come un costrutto
più comodo quando si devono testare molte condizioni. In ogni caso, il ricorso agli operatori
di confronto funziona:

Codice: Seleziona tutto

$temperatura = 37;
switch ($temperatura) {
case ($temperatura>=30 and $temperatura<=32):
echo "GELIDO <br>";
break;
case ($temperatura>=33 and $temperatura<=35):
echo "FREDDO <br>";
break;
case ($temperatura>=36 and $temperatura<=38):
echo "TIEPIDO <br>";
break;
default:
echo "Non so che temperatura c'è<br><br>";
}
funziona. Certo, l'obiettivo è per l'appunto
econimizzare il codice. Sto sperimentando...

Grazie a tutti
M.

PS
Okkio:
} elseif ($t >= 31 && $t <= 32 ) { echo "verso il freddo" ;
} elseif ($t >= 33 && $t <= 34) { echo "caldo":non : ma ;