Curiosità sulla istruzioni switch di PHP

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Curiosità sulla istruzioni switch di PHP

Messaggio 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.

Avatar utente
giberg
Linux 4.x
Linux 4.x
Messaggi: 1282
Iscritto il: mer 21 set 2005, 17:28
Nome Cognome: Gianni
Slackware: current64
Kernel: 3.7.1
Desktop: 4.8.5
Località: S. Biagio di Callalta (TV)

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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").

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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

Avatar utente
teox99
Linux 3.x
Linux 3.x
Messaggi: 738
Iscritto il: ven 25 lug 2008, 14:54
Slackware: 13.37
Desktop: KDE - Xfce
Località: Roma[Eur]
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio da teox99 »

la migliore e' utilizzare degli elseif.

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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.

Avatar utente
giberg
Linux 4.x
Linux 4.x
Messaggi: 1282
Iscritto il: mer 21 set 2005, 17:28
Nome Cognome: Gianni
Slackware: current64
Kernel: 3.7.1
Desktop: 4.8.5
Località: S. Biagio di Callalta (TV)

Re: Curiosità sulla istruzioni switch di PHP

Messaggio da giberg »

Ma hai provato a fare qualcosa
del tipo
case ($temperatura>=30 and $temperatura<=35)

per vedere se funziona?

Avatar utente
teox99
Linux 3.x
Linux 3.x
Messaggi: 738
Iscritto il: ven 25 lug 2008, 14:54
Slackware: 13.37
Desktop: KDE - Xfce
Località: Roma[Eur]
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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"

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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.

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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 £?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
teox99
Linux 3.x
Linux 3.x
Messaggi: 738
Iscritto il: ven 25 lug 2008, 14:54
Slackware: 13.37
Desktop: KDE - Xfce
Località: Roma[Eur]
Contatta:

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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"; }
Ultima modifica di teox99 il sab 31 gen 2009, 23:49, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Curiosità sulla istruzioni switch di PHP

Messaggio 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 ;

Rispondi