Il sito per imparare gratuitamente a fare pagine Web

Corso PHP














Questa guida non è stampabile per volontà del suo stesso autore Claudio Curci.



Guida PHP scritta da Claudio Curci - Aggiornamenti di Max Kiusso

lezione 4: commenti, array, cicli while

Sommario lezione

. i commenti
. array indefiniti
. i cicli while
. gli array associativi



I commenti

Dopo tre lezioni, siete già in grado di scrivere programmi complessi, con diverse righe di codice. Immaginate di dover scrivere un intero sistema di commercio elettronico o di gestione di un portale.. facilmente superereste le migliaia di righe di codice.

E' bene che fin d'ora impariate a commentare i vostri script. I commenti sono delle righe che vengono ignorate dal motore php, per cui all'interno potete scrivere tutto quello che volete. Il loro scopo è rendere più facile la lettura del codice. Ora conoscete forse a memoria gli script elaborati: ma quando le righe aumenteranno? Quando saranno passati dei mesi e dovrete correggere un programma perchè al cliente non piace più? O quando dovrà mettere mano sul vostro codice un collega? I commenti sono una parte fondamentale nella gestione e manutenzione di un programma.
In PHP potete inserire commenti in questo modo:

- con "//" (senza i doppi apici inserite un commento a riga singola. Il motore PHP ignorerà tutto ciò che segue i segni "//" e che arriva alla fine della riga;

- con "/*" e "*/" il commento può estendersi su più righe, in quanto il motore PHP ignorerà tutto ciò che è compreso tra "/*" e "*/";

- con "#" ottenete lo stesso risultato di "//", in effetti è un modo poco utilizzato, familiare però per chi viene da ambienti Bourne shell.

Esempio pratico (vi consiglio di copiare/incollare questo codice e mandarlo in esecuzione per verificarne il risultato):



Array indefiniti

Abbiamo appreso nella scorse lezioni che una variabile è un cassetto, più o meno come quello della vostra scrivania, che però può contenere un solo valore.
Un array è una variabile complessa, un cassetto che può contenere più cose.
Nell'esempio dell'ultima lezione abbiamo avuto a che fare con un insieme definito di dati:

$elenco_squadre = array("Ascoli","Atalanta","Avellino","Brescia","Como","Empoli","Fiorentina","Inter", "Juventus","Milan","Napoli","Roma","Sampdoria","Torino","Udinese","Verona");


(come al solito, non fate caso se vedete l'istruzione andare a capo, voi scrivete tutto sulla stessa riga, almeno per quanto riguarda la dichiarazione di un array).

Sappiamo tutti che nel campionato italiano è necessario avere molti giocatori. Tra coppe, amichevoli, nazionale ecc., 24 giocatori potrebbero non bastare.
Per questo è stato ideato il "mercato di riparazione", dove le squadre possono acquistare nuove forze e giocatori.
Ipotizziamo un array "$napoli" contenente i nomi di tutti i giocatori:

$napoli = array("Bagni", "Bigliardi", "Bruscolotti", "Caffarelli", "Carranante" );

I nomi sono presi dal Napoli 1986-87. Quell'anno la squadra partenopea, ad ottobre, acquistò un centrocampista di indiscusso valore: Francesco Romano.
All'epoca girava ancora il commodore64 (e forse era meglio cosi), ma oggi come potremmo gestire una situazione del genere in PHP? Prima abbiamo creato il nostro bel vettore, il nostro "Array",con quei nomi: come aggiungerne uno in più?
E' semplice:

$napoli[]="Romano";

In questo modo, viene aggiunto un nuovo elemento.. ma se $napoli[0] ci restituiva "Bagni", e $napoli[1] "Bigliardi", in quale posizione sarà inserito Romano? Nell'ultima disponibile, ovviamente. Nell'esempio di prima abbiamo inserito, per comodità, 5 giocatori; Romano sarebbe perciò il sesto elemento, quindi $napoli[5] -ricordate che in PHP gli indici iniziano da zero vero?-

Finora abbiamo avuto a che fare con pochi elementi di un array. Per scorrerli tutti, nella scorsa lezione, abbiamo utilizzato un ciclo for, che nel secondo parametro accetta il numero totale degli elementi.
Finchè sono pochi possiamo anche contarli a manina, e dare come condizione di terminazione il risultato (sottratto di uno perchè i numeri partono da zero):

for($contatore=0;$contatore<6;$contatore++){<br> }

Finchè gli elementi sono pochi, o finchè sono sempre gli stessi, va bene cosi. Ma se avessimo a che fare con il totale di tutti i calciatori che hanno militato nel nostro campionato? Potremmo mai contare migliaia di nomi (magari presi da un file di testo o da un database e caricati in un array), con il rischio di saltarne qualcuno?
Tra le funzioni che PHP mette a disposizione del programmatore, una si occupa proprio di contare gli elementi di un insieme: count.
Analizzate il seguente codice, credo che in base alle nozioni finora lette dovrebbe essere alla vostra portata (magari dopo un pò di ragionamento, ma solo cosi imparerete davvero a programmare.. finchè troverete la pappa pronta sarà impossibile salire di gradino ricordate!)



Come al solito, per questioni di output su video, sono stato costretto ad andare a capo. Voi non andate a capo finchè non trovate il punto e virgola ok? (in pratica, la riga dell'array() e quella dell'echo sono quelle "incriminate" in cui dovete scrivere tutto sulla stessa riga anche se qui vedete diversamente).

Visto che qualcuno nel forum parlava di esercizi, vi lascio il primo: nell'output dello script appena presentato, c'è il difetto del contatore, per cui troviamo "il giocatore numero 0 è Bagni".
Provate a correggere qualcosa in modo che venga visualizzato "il giocatore numero 1 è Bagni".. E già che ci siete, correggete un'altro bug: in realtà l'ordine proposto non è alfabetico, perchè Romano appare per ultimo, andrebbe invece prima di Sola e dopo Renica.. e visto che la scorsa volta abbiamo scaricato il manuale, trovate la funzione che permette di visualizzare l'ordine inverso (ovvero, da Volpecina a Bagni).

I cicli while

Il ciclo for non è l'unico modo messo a disposizione da PHP per eseguire operazioni ripetute.
Esiste un costrutto che finora non abbiamo mai utilizzato, il ciclo while.
Un while ha questa sintassi:

while(condizione){
     istruzioni;
}


Se (condizione) risulta vera, vengono eseguite le istruzioni comprese tra le parentesi graffe. Al termine, viene di nuovo valutata (condizione): se risulta ancora vera (le istruzioni tra le graffe possono averne cambiato i valori), si rientra nel ciclo e cosi via. Non a caso, "while" sta per "finchè..". Attenti quando usate un while: verificate che prima o poi, grazie alle istruzioni tra le graffe, la condizione diventi falsa, altrimenti il ciclo verrebbe eseguito all'infinito.
Un costrutto del genere:

$variabile=0;
while( $variabile == 0 ){
     echo "la variabile adesso è " . $variabile;
}


stamperebbe senza fine la frase (in realtà esiste un tempo di timeout oltre il quale PHP cessa l'esecuzione, ma questo è un altro discorso), perchè $variabile non ha modo di cambiare valore. Nel ciclo for utilizzavamo un contatore che veniva incrementato automaticamente per ogni ciclo; nel while questo non avviene se non viene inserita un'istruzione apposita.
Andiamo a scorrere l'array $napoli di prima con un ciclo while anzichè con un for:

while(list($squadra,$giocatore)=each($napoli)){
    echo "Il giocatore (in ordine alfabetico) numero " . $squadra . " è: <b>" . $giocatore . "</b>.<br>";
}


Il risultato è lo stesso, ma ottenuto in modo diverso e -almeno per come lo vediamo adesso- più complicato: cosa sono quei "list" e "each"? Per scorrere un array semplice, può essere utilizzato un ciclo for; ma per estrarre dati da una query di solito si ricorre ad un while, perchè permette in maniera più elastica di utilizzare funzioni particolari. list() e each() sono due di queste funzioni: in questo caso sono evitabili, ma quando avremo a che fare con le query non ne potremo fare a meno, in quanto il risultato di un'interrogazione ad un database non è un insieme ben definito.

each() prende come parametro un insieme (nel nostro caso, l' array chiamato $napoli) e restituisce 1 coppia chiave/valore. La chiave di un array è il suo indice numerico (0 per il primo elemento, 1 per il secondo, 2 per il terzo e cosi via). Il valore è ovviamente il contenuto di quel "sotto-cassetto". I due valori vengono restituiti in un altro array di due elementi. Fin qui.. sembra tutto inutilmente complicato. La funzione list() però risolve tutto: prende come parametro delle variabili temporanee, dei contenitori dove memorizzare (con "=" assegnamo ad una funzione un valore) il risultato di each.

Poniamo un esempio pratico. Pensate ad una partita di calcio: prima dell'inizio, le due squadre entrano in campo dagli spogliatoi, solitamente in due file indiane (una per formazione). I giocatori entrano in campo a due a due.
Questo è il compito di each: estrarre da un array due valori per volta, ovvero la chiave (l'indice: 0 per il primo elemento, 1 per il secondo ecc.) e il valore della variabile corrente.

I giocatori, una volta entrati, vanno da soli verso il centrocampo per salutare gli spettatori nelle tribune.
Le variabili del computer, da sole, non vanno da nessuna parte! Altro che intelligenti, i computer fanno solo quello che gli viene detto.. con list(variabile1, variabile2) diciamo alla coppia di valori estratti di entrare nei contenitori relativi.
Il codice completo è questo:



Gli array associativi

Chiudiamo questa lezione parlando di array particolari, che non tutti i linguaggi supportano. Finora il nostro array aveva come chiave un valore numerico. Questa struttura è utile quando abbiamo un semplice elenco: "nro_ordine=>nome_squadra". E se volessimo memorizzare invece il numero di scudetti vinti, squadra per squadra? Qualcosa del tipo: "nome_squadra=>scudetti_vinti", rinunciando ovviamente ad un indice numerico (tra l'altro, con le funzioni di ordinamento degli array, non servirebbe a nulla memorizzare un indice progressivo).
A ben vedere, in questo caso, servirebbe un indice stringa, qualcosa del tipo "Juventus=>22, Inter=>12, Milan=>10" e cosi via (mi riferisco alla stagione calcistica 1986-87, non fate caso alla realtà dei numeri).
Un array associativo utilizza questa sintassi:



Sapreste scorrere un array del genere con un ciclo for? Visto che ora l'indice non è più numerico.. l'impresa diventa ardua non trovate? Ma adesso conosciamo anche altre funzionalità di php, come while, each, list.. dall'esempio precedente dobbiamo cambiare ben poco:



Ancora dubbi sulle possibilità offerte da un ciclo while? Per chiarirli, provate a scorrere un array associativo con un ciclo for.. bel "compito a casa"!

Termina qui la quarta lezione. Abbiamo visto meno concetti perchè abbiamo parlato di array associativi. Questi sono la base per scorrere i risultati delle query, quindi cercate di prendere familiarità e se avete dubbi scrivete sul forum.



Se avete domande potete scrivere sul forum di supporto, gratuito e aperto a tutti.



Claudio Curci e Max Kiusso per Web-Link.it