Corso PHP: 9. Array – 9.1 Gli array monodimensionali

9.    Array

Affrontiamo ora il complesso e fondamentale tema degli array già accennato al paragrafo 4.1 parlando del tipo di dati.

Un array è essenzialmente un insieme ordinatio di ‘dati’, dove per dati non si intende solamente ‘valori’, ma più genericamente chiave (che specifica il tipo di valore) + valore.

Un array può essere definito con la sintassi:

$arr = array();

a cui poi assegnare i valori con successive istruzioni oppure costruito direttamente assegnando un valore ai singoli elementi senza prima dichiararlo.

9.1   Array monodimensionali

Ad esempio i dati che individuano una persona, quali:

–          nome
–          cognome
–          data di nascita
–          luogo di nascita
–          indirizzo
–          ……..

possono essere raggruppati in un array. Sarebbe coorispondente a quello che è in altri linguaggi, un record.

La sintassi del PHP per l’array dell’esempio, che chiameremo $user, è:

$user = array(
   “nome”=>”Mario”,
   “cognome”=>”Rossi”,
   “data_nascita”=>”1900/01/01”,
   “luogo_nascita”=>”Roma”,
   “indirizzo”=>”via col vento”,
   ……..
);

Ovviamente dove abbiamo messo i puntini vanno gli altri campi dell’array. Come sempre dove abbiamo usato le virgolette possono anche essere usati gli apici.

Questa non è tuttavia l’unica sintassi accettabile per definire un array. Lo stesso array dell’esempio può anche essere definito come segue:

$user[“nome”] = “Mario”;
$user[“cognome”] = “Rossi”;
$user[“data_nascita”] = “1900/01/01”;
$user[“luogo_nascita”] = “Roma”;
$user[“indirizzo”] = “via col vento”;

Questo è un tipo di array monodimensionale, ma naturalmente esiste anche il classico tipo di array monodimensionale dove si hanno una serie di valori ordinati e l’indice dell’array non è una key (come viene chiamata in PHP), ma il valore numerico progressivo a partire dallo 0 per il primo elemento.

Ad esempio questo è un classico tipo di array come quello previsto in tutti i linguaggi:

$frutti[0] = “mela”;
$frutti[1] = “pera”;
$frutti[2] = “banana”;
$frutti[3] = “pesca”;
$frutti[4] = “arancia”;

Anche in questo caso può essere usata la sintassi vista inizialmente e la definizione diventerebbe:

$frutti = array(
   0=>       “mela”,
   1=>       “pera”,
   2=>       “banana”,
   3=>       “pesca”,
   4=>       “arancia”,
);

Inoltre nel caso di indice numerico, l’indice può anche essere omesso per cui le due seguenti definizioni sarebbero del tutto equivalenti a quelle appena viste:

$frutti[] = “mela”;
$frutti[] = “pera”;
$frutti[] = “banana”;
$frutti[] = “pesca”;
$frutti[] = “arancia”;

oppure:

$frutti = array(“mela”, “pera”, “banana”, “pesca”, “arancia”);

Come avrete notato dagli esempi se la chiave è una stringa va sempre racchiusa tra virgolette od apici, mentre se è un valore numerico no. Lo stesso vale per il valore del singolo elemento dell’array.

per quanto riguarda i valori attenzione anche alle costanti TRUE e FALSE che NON vanno racchiuse tra apici altrimenti verrebbero interpretate come stringhe dal valore VERO, cioè “FALSE” assumerebbe valore TRUE.

Sempre a proposito delle chiavi bisogna notare che PHP non pone limite alcuno alla scelta delle chiavi. Così anche un valore decimale tipo 1.17 sarebbe accettabile come chiave, così come il valore booleano TRUE (oppure FALSE). Attenzione però a come vengono trattati questi valori perché si avrebbero spiacevoli sorprese. Guardiamo l’esempio che segue:

$array = array(
   1 => “a”,
   “1” => “b”,
   1.7 => “c”,
   TRUE => “d”,
);

La stringa “1” viene convertita in numero intero e diventa 1.

Il valore decimale 1.7 viene convertito in intero troncando (non arrotondando) le cifre decimali; diventa quindi anch’esso 1.

Il valore logico TRUE viene rappresentato in memoria col numero 1 e quindi ci troviamo ad avere quattro elementi tutti con la stessa chiave. Gli elementi verranno quindi sovrascritti ed il risultato sarà di avere nell’array un solo elemento (1 => “d”).

Altre importanti considerazioni sulle chiavi di un array:

  • come abbiamo visto le chiavi possono anche essere omesse, ma questo non significa che gli elementi non vengano mantenuti nell’ordine in cui sono stati indicati.
    Nell’esempio di prima se definiamo:

    $frutti = array(“mela”, “pera”, “banana”, “pesca”, “arancia”);

    in realtà agli elementi viene assegnata internamente una chiave numerica progressiva partendo da zero per cui $frutti [2] sarà sempre = “banana”;

  • se definiamo un array come segue:$frutti[] = “mela”;
    $frutti[] = “pera”;
    $frutti[] = “banana”;
    $frutti[8] = “pesca”;
    $frutti[] = “arancia”;

    internamente gli indici dell’array diventeranno come segue:

    $frutti[0] = “mela”;
    $frutti[1] = “pera”;
    $frutti[2] = “banana”;
    $frutti[8] = “pesca”;
    $frutti[9] = “arancia”;

    il che ci dice che anche gli indici numerici non necesseriamente devono essere consecutivi. Non solo ma possono anche essere mischiati a chiavi espresse con stringhe.
    Potremo quindi benissimo avere un array così definito:

    $frutti[] = “mela”;
    $frutti[] = “pera”;
    $frutti[“gialla”] = “banana”;
    $frutti[8] = “pesca”;
    $frutti[] = “arancia”;

    che corrisponderà a:

    $frutti[0] = “mela”;
    $frutti[1] = “pera”;
    $frutti[“gialla”] = “banana”;
    $frutti[8] = “pesca”;
    $frutti[9] = “arancia”;
  • Infine si deve tener presente che le chiavi anche se numeriche non devono necessariamente essere definite consecutivamente. Potremmo definire un array come segue:$frutti[0] = “mela”;
    $frutti[1] = “pera”;
    $frutti[5] = “banana”;
    $frutti[2] = “pesca”;
    $frutti[3] = “arancia”;

    per il PHP questo va benissimo. Occorre però tener presente che gli elementi saranno poi trattati in un ordine differente a seconda del costrutto che si andrà ad utilizzare come vedremo subito dopo.

Vediamo ora come vanno trattati gli array.

Le strutture di controllo adatte a trattare gli array sono tutte quelle che consentono di ciclare e quindi sono:

–          for
–          foreach
–          while
–          do/while

Il caso più semplice è quello di un array monodimensionale costruito con indici numerici progressivi per cui può agevolmente essere usato un ciclo for per trattare i singoli elementi. Da notare che non è indispensabile conoscere il numero degli elementi dell’array perché esiste una funzione di PHP (che vedremo successivamente) che restituisce appunto il numero di elementi di una array . Si chiama count($nomearray) dove ovviamente $nomearray è il nome del nostro array.

per cui il seguente è un esempio di ciclo for con cui portiamo a video il contenuto dell’array:

for($i = 0; $i < count($nomearray); $x++){
   echo ‘$nomearray[’ . $i . ‘] = ’ . $nomearray[$i] . ‘<br>’;
}

Ricordiamo che $nomearray tra apici non viene sostituito col nome dell’array dal PHP, come avverrebbe se fosse tra virgolette, ma viene trattato come una stringa e portato a video così com’è. Abbiamo poi usato l’operatore di concatenamento (il punto)  per costruire sia la parte descrittiva a sinistra dell’uguale sia il valore del corrispondente elemento a destra dell’uguale.

Abbiamo visto però che non sempre gli elementi di un array hanno indice numerico progressivo per cui non sempre si può usare il costrutto for. Particolarmente importante è quindi il costrutto foreach.

foreach($array as $value) {
   ....
   istruzioni
   ....
}

In questo modo possono essere trattati tutti gli elementi di un array, anche se non ne conosciamo il numero.
Questo ciclo, per ogni elemento dell’array, trasferirà il valore in una variabile di comodo $value e quindi eseguirà le istruzioni utilizzando $value.

Riferendoci all’esempio precedente della frutta potremo scrivere:

foreach ($frutti as $frutto) {
   echo ‘$frutti = ‘ . $frutto . ‘<br>’;
}

Notiamo subito che se le chiavi numeriche non fossero in sequenza, come nell’ultimo esempio il ciclo for stamperebbe gli elementi secondo l’ordine numerico delle chiavi (0,1,2,3,5), mentre il ciclo foreach li stamperebbe secondo l’ordine di inserimento (0,1,5,2,3).

Con la foreach fatta così peraltro l’intestazione del singolo elemento a video sarebbe sempre semplicemente ‘$frutti =’ senza indicazione della chiave del singolo elemento.

Se vogliamo anche riportare il nome della chiave si può allora usare la forma più completa di foreach come segue:

foreach($array as $key=>$value) {
   ....
   istruzioni
   ....
}

e quindi nel nostro solito esempio:

foreach ($frutti as $chiave=>$frutto) {
   echo ‘$frutti[’ . $chiave . ‘] = ’ . $frutto . ‘<br>’;
}

Un ultimo esempio lo riserviamo per un tipico utilizzo del ciclo while.

Vogliamo riempire un array con i nomi dei file di una specifica cartella. Lo script seguente fa al caso nostro:

$handle = opendir('.');
while (($file = readdir($handle)) !== FALSE) {
   $files[] = $file;
}
closedir($handle);

L’esempio utilizza particolari funzioni per il trattamento di files e directories che verranno viste molto più avanti. Per ora prendete lo script così com’è come esempio di utilizzo di ciclo while per riempire un array.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.