Pillolina. Introduzione agli array .
Ciao a tutti. Ho guardato la sezione relativa alle pillole e mi sono reso conto che non esiste un piccolo vademecum per la gestione degli array. Ho deciso pertanto di scriverne uno io, soprattutto per i neofiti al fine di chiarire alcuni concetti tipo come faccio a stampare il contenuto dell'array, come recupero le checkbox da un form, ecc.
Essendo la mia prima pillola, per quanta cura possa metterci, chiedo ai forumisti più navigati di avere pazienza ed evidenziare eventuali errori.
Che cos'è un array.
Iniziamo. Prima di tutto cos'è un array.
Un array non è altro che una variabile che contiene più valori.
Ci addentreremo dopo nei dettagli.
Per dichiarare un array si ricorre per l’appunto al costrutto array().
$nomi = array (“Nicola”,”Mario”,”Giuseppe”, “Franco”);
$numeri = array(10,20,25,13,8);
Abbiamo in questo modo definito due array tramite un assegnamento esplicito di variabili.
Da notare che l’array $nomi contiene delle stringhe, tant’è vero che i nomi sono stati racchiusi tra virgolette, mentre $numeri contiene valori interi e dunque le virgolette non sono necessarie.
Come si accede agli elementi?
Gli elementi di un array sono accessibili tramite un indice.
Ciò significa che “Nicola” sarà il contenuto di $nomi[0], “Mario” di $nomi[1], “Giuseppe” di $nomi[2] ed infine Franco di $nomi[3].
Da notare che, qualora non venga specificato, l’indice parte da 0 come nel nostro caso.
Qualora volessimo che $nomi parta da 1 anziché da 0 sarà sufficiente modificarlo così:
$nomi_indice_1 = array (1=>“Nicola”,”Mario”,”Giuseppe”, “Franco”);
Si può vedere come sia sufficiente definire il valore di partenza, infatti qualora l’indice sia un intero, i valori successivi avranno indici progressivi (con passo d’incremento pari a 1).
Dunque ora “Nicola” si troverà in $nomi_indice_1[1] fino ad arrivare a Franco che sarà in $nomi_indice_1[4].
Esiste anche un altro modo per definire un array (assegnamento implicito):
$nomi = array(); //inizializziamo la nostra variabile
A questo punto procediamo all’inserimento dei nostri valori tramite gli indici. Quindi:
$nomi[0] = “Nicola”;
$nomi[1] = “Mario”;
$nomi[] = “Giuseppe”;
$nomi[] = “Franco”;
Nel caso di Giuseppe e Franco non abbiamo definito un indice. Ciò nonostante PHP provvederà per noi a collocare l’elemento dichiarato alla fine dell’array.
Possiamo notare comunque come sia decisamente più comodo dichiarare un array come abbiamo fatto la prima volta.
Lettua del contenuto di un array .
Ok. Ho definito un array. Ma come ne esamino il contenuto adesso?
Esistono diversi modi per “scorrere” un array.
Il metodo più comodo è quello di ricorrere alla struttura foreach .
Se ad esempio vogliamo esaminare il contenuto dell’array $nomi possiamo fare così:
Codice PHP:
foreach($nomi as $valore)
echo $valore. "
";
dove $valore è un nome arbitrario che ho scelto io. Abbiamo così eseguito un loop sull’array.
Se invece oltre ai valori volessimo recuperare anche i rispettivi indici di ciascun elemento la sintassi diventa:
Codice PHP:
foreach($nomi as $chiave => $valore)
echo $chiave. " " . $valore . "
";
Provate questa struttura con i due array $nomi e $nomi_indice_1 e noterete come effettivamente l’indice di partenza sia in un caso 0 e nell’altro 1.
Altro modo: utilizzo del ciclo for . Questo va bene solo qualora gli indici dell’array siano numerici e non presentino buchi, cioè siano tutti in sequenza. In questo caso possiamo fare:
Codice PHP:
Per l’array con indice iniziale 0
for($i=0; $i<sizeof($nomi); $i++)
echo $nomi[$i]. "
";
Per l’array con indice iniziale 1
Codice PHP:
for($i=1; $i<=count($nomi_indice_1); $i++)
echo $nomi_indice_1[$i]. "
";
notare come le funzioni sizeof() e count() si equivalgono.
Esiste un altro modo: l’utilizzo del ciclo while con la struttura list() = each().
Personalmente non la utilizzo quasi mai perché trovo più agevole il foreach. Però è bene sapere che esiste.
Codice PHP:
while ( list($chiave,$valore) = each($nomi) )
echo "$chiave: $valore
";
Funzioni relative agli array.
Php mette a disposizione una vasta gamma di funzioni relative agli array. Ovviamente non è questo il luogo più indicato a elencarle tutte.
Prenderemo in considerazione quelle di utilizzo più frequente.
- Voglio aggiungere un elemento al mio array:
array_push($nomi,"Stefano"); Questa funzione accoderà all’array $nomi il nome Stefano.
- Voglio recupare l’ultimo elemento:
$ultimo = array_pop($nomi);
Se diamo un echo alla variabile $ultimo vedremo che in effetti contiene “Stefano” e che l’array $nomi è stato accorciato, privandolo dell’ultimo valore.
Facendo così siamo tornati alla situazione iniziale, quella precedente alla funzione array_push. Stefano è ora scomparso (dall’array $nomi intendo).
- Voglio sapere il numero di occorrenze (cioè quante volte si ripete) di ciascun valore:
array_push($nomi,”Mario”); // mi serve per l’esempio. Non è questa la funzione.
var_dump(array_count_values($nomi));
In questo caso abbiamo prima inserito un nuovo elemento nell’array. Con la funzione array_count_values() calcoliamo le nostre occorrenze. Avremo tutti i valori pari a 1 tranne Mario che sarà pari a 2.
La funzione var_dump recita testuale il manuale ufficiale “visualizza delle informazioni strutturate riguardanti un’espressione, tra cui il suo tipo e il suo valore”.
Risulta essere molto utile in fase di debug. Allorché effettuiamo un’operazione sugli array sarebbe scomodo ogni volta dover fare un ciclo per “echare” la variabile.
Così invece abbiamo un immediato riscontro di ciò che contiene. Questo è l’output del mio var_dump:
array(4) { ["Nicola"]=> int(1) ["Mario"]=> int(2) ["Giuseppe"]=> int(1) ["Franco"]=> int(1) }
- Quanto è lungo il mio array:
come detto in precedenza si può usare count() oppure sizeof().
Come faccio ad eliminare i doppioni?
$animali = array("cane","cane","gatto","cavallo","leone");
$animali_diversi = array_unique($animali);
sort($animali_diversi);
La funzione array_unique elimina i doppioni e, come è giusto che sia, mantiene le chiavi.
Molto spesso nel forum la gente chiede come rendere contigui gli indici una volta eliminati i doppioni. Semplicemente si usa la funzione sort() e le chiavi dei valori diventeranno 0,1,2,3 ecc.
In realtà non abbiamo “tappato i buchi” ma semplicemente riordinato.
La soluzione migliore sarebbe questa:
$nuovo_animali_diversi = array();
foreach($animali_diversi as $animale)
$nuovo_animali_diversi[] = $animale;
In pratica non facciamo altro che inizializzare un nuovo array, ciclare il precedente e mettere nel nuovo tutti i valori contenuti nel vecchio.
Voglio crearmi un’array di numeri da 1 a 100. Li devo scrivere uno per uno?
In questo caso ci viene in soccorso la funzione range().
$valori = range(1,10);
E’ decisamente più comodo che scriverli uno per uno. L’altra possibilità sarebbe stata un ciclo for.
Codice PHP:
for($i=1;$i<=100;$i++)
{
$numeri_da_1_a_100[$i] = $i;
echo $numeri_da_1_a_100[$i]. "
";
}
Ma perché complicarsi la vita se php ce la semplifica?
Altra funzione che si userà spesso è in_array.
Come il nome lascia intuire permette di verificare se un valore è presente nell’array.
Semplice esempio:
Codice PHP:
$forum = array("ASP", "PHP", "HTML", "Reti");
if (in_array("ASP", $forum))
echo "Il forum c'è.";
else
echo “Il forum non c’è.”;
Gli array di PHP si dividono in array scalari e array associativi.
In realtà ciò non è propriamente esatto, visto che fondamentalmente php considera e gestisce tutti gli array come associativi.
Ad esempio, quando abbiamo definito l'array $nomi con il suo contenuto, abbiamo visto come php assegni chiavi numeriche partendo da zero.
Recupero di array tramite form.
Sono molto frequenti i post in cui gli utenti hanno difficoltà a recupare le informazioni inviate tramite form e che devono restituire più di un unico risultato. Mi riferisco alle checkbox e alle select che consentono scelte multiple. Supponiamo di avere un form del genere che ci chieda i nostri colori e sport preferiti.
Rosso<input type="checkbox" name="colore[]" value="rosso">
Verde<input type="checkbox" name="colore[]" value="verde">
Giallo<input type="checkbox" name="colore[]" value="giallo">
Blu<input type="checkbox" name="colore[]" value="blu">
<select name="sport[]" multiple>
<option value="calcio">calcio</option>
<option value="basket">basket</option>
<option value="tennis">tennis</option>
<option value="pallavolo">pallavolo</option>
</select>
La cosa che desterà stupore agli occhi dei meno pratici è sicuramente la presenza delle parentesi quadre. Ciò serve a “mettere in guardia” PHP, nel senso che saprà di doversi attendere un array e non un singolo valore. Se le omettessimo, i checkbox si contenderebbero la scelta e alla fine verrebbe recuperata solo l’ultima tra quelle scelte (dove per ultima non si intende quella cronologicamente scelta ma l’ultima rispetto all’ordine del form.
Per recupare i le preferenze dell’utente facciamo così:
Codice PHP:
if (isset($_POST['colore']))
{
$colori_preferiti = $_POST['colore'];
foreach($colori_preferiti as $valore)
{
echo $valore. "
";
}
}
else
{
echo "Devi scegliere almeno un colore";
}
Codice PHP:
if (isset($_POST['sport']))
{
//$sport_preferiti = $_POST['sport'];
$sport_preferiti = implode(",",$_POST['sport']);
echo $sport_preferiti;
foreach($sport_preferiti as $valore)
{
echo $valore. "
";
}
}
else
{
echo "Devi scegliere almeno uno sport";
}
Mentre nel caso dei colori abbiamo scelto di visualizzarli ciascuno in una riga, nel secondo caso abbiamo usato la funzione implode, che trasforma un array in una stringa, e li abbiamo concatenati tramite la virgola. Da notare come la virgola non compaia dopo l’ultimo elemento.
Grazie all’implode possiamo ad esempio salvare in un unico campo di un db tutte le preferenze dell’utente. Ovviamente poi a seconda delle esigenze si deciderà come gestire tutti i dati passati.
Si conclude qui questa breve introduzione. Ovviamente gli argomenti sono tanti. Tanto per dirne una sono stati fatti esempi solo di array monodimensionali mentre php consente di gestire senza difficoltà anche array a più dimensioni o matrici.