[PHP] Un ciclo al posto di tanti if
Giovanni
| Argomenti: php, foreach, array | 6510
Vedo spesso codice PHP con una serie di if annidati da fare spavento, dove, alla fine dei conti, si ripete un test su una variabile dove i valori di confronto però cambiano.
La soluzione, quando il numero di if aumenta parecchio, è quella di creare un array di valori e di usare quelli come elementi di confronto in modo tale da confinare tutti i valori di confronto all’interno di un array e l’elaborazione vera e propria successivamente.
Ecco allora un esempio esemplificativo:
<? $arrayRange = array( array(0, 100, "Primo range"), array(101, 10000, "Secondo range"), array(10001, 10002, "Terzo range"), array(10003, 99999, "Ultimo range") ); // QUESTO E' IL VALORE DA CONFRONTARE (qui e' possibile mettere valori per il test) $valConfronto = 10001; foreach ($arrayRange AS $myRange) { list($valI, $valF, $valEcho) = $myRange; if ($valConfronto >= $valI && $valConfronto <= $valF) { echo $valEcho; break; } } ?>
Questo esempio sostituisce un codice simile al seguente:
<? // QUESTO E' IL VALORE DA CONFRONTARE (qui e' possibile mettere valori per il test) $valConfronto = 10001; if ($valConfronto >= 0 && $valConfronto <= 100) { echo "Primo Range"; } elseif ($valConfronto >= 101 && $valConfronto <= 10000) { echo "Secondo Range"; } elseif ($valConfronto >= 10001 && $valConfronto <= 10002) { echo "Terzo Range"; } elseif ($valConfronto >= 10003 && $valConfronto <= 99999) { echo "Ultimo Range"; } ?>
Con solo 4 range il codice è paragonabile in termini di lunghezza, ma provate a pensare a una serie di confronti nell’ordine di qualche decina e vi risulterà lampante la pulizia del codice della prima soluzione.
Infine occorre notare che il contenuto dell’array può tranquillamente essere il risultato dinamico di una query da database, operazione non possibile nel secondo caso.
Pubblicato in Funzioni e classi PHP e C |
6 Gennaio 2007 alle 06:58
Sicuramente un’alternativa ma come soluzione la seconda è molto più performante e chiara per un serie di motivi, nella prima rispetto alla seconda:
1- viene istanziato un array
2- ad ogni ciclio foreach viene eseguito un count()
3- le if totali saranno le stesse delle seconda
4- il listing nel foreach a questo punto è inutile se proprio vuoi risparmiare di scrivere codice
12 Aprile 2007 alle 17:56
ciao, voglio fare il massimo e la media di un array. ho un array di 4 elementi. voglio fare il massimo solo tra i numeri
12 Aprile 2007 alle 17:59
ciao, voglio fare il massimo e la media di un array di 4 elementi. voglio però il massimo e la media solo tra i numeri minori di un certo valore limite (ex 66666) e nn di tutti. aspetto una risp. ciao
12 Aprile 2007 alle 19:12
Un programma già pronto non sarebbe “corretto”, ti do’ qualche dritta.
setti una variabile max = 0;
setti una variabile somma = 0;
setti una variabile elementi = 0;
Cicli sugli elementi
- se l’elemento è minore di 66666 allora:
. sommi l’elemento a somma
. sommi 1 a elementi
. se l’elemento è maggiore di max setti max = elemento;
Alla fine la media è la somma - il numero di elementi
12 Aprile 2007 alle 19:32
questo vale anche per elementi presi da un database? nel mio caso ho: $row[primo]…$row[quattro], quindi come faccio a prendere un elemento alla volta? conviene compattargli in un unico array o non ci sono problemi se tratto il tutto come quattro numeri diversi? cmq grazie per la dritta che sicuramente sarà ottima!. Ciao