Array associativi.

Per una descrizione completa riferirsi alla guida.

Un array in PHP è una tabella, cioè un insieme di valori individuati da un indice detto chiave di accesso.

Si può creare un array ordinario, una lista, una tabella Hash, un dizionario, uno stack, una coda, un albero ecc.

Un array viene creato con la funzione array(). Tra parentesi si inseriscono i valori degli elementi, in questo caso gli indici degli elementi iniziano da 0 e aumentano progressivamente, se però è associativo, tra le parentesi vanno specificate le coppie chiave => valore, separate da virgola.

Le Chiavi possono essere dei valori interi o delle stringhe. Quando la chiave è un intero l'array è detto con indice, quando la chiave è una stringa l'array è detto associativo. La chiave di tipo intero viene specificata se la numerazione degli indici non è continua.

Il valore di un elemento può essere di qualsiasi tipo.

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Elenco dei libri:</h1>

<?php

  $Biblio=array("Autore"=>"Gianni Rodari", "Titolo"=>"il treno azzurro", "Note"=>"Avventure");

  echo $Biblio["Autore"];

  echo '<br />';

  print_r($Biblio);

?>

</body>

</html>

Commenti al programma:

La variabile $Biblio è un array di tre elementi a cui si può accedere tramite le chiavi: Autore, Titolo e Note, questo array, quindi, è simile ad un record.

Al browser viene inviato solo il valore del campo Autore.

Al browser si invia il tag per prepararsi a stampare sulla linea successiva.

La funzione print_r stampa il contenuto di una variabile in un formato facilmente leggibile. Se la variabile contiene una stringa, un intero o un numero decimale, viene mostrato il valore stesso. Se la variabile contiene un array vengono mostrati i valori in un formato che evidenzia le chiavi ed i relativi elementi.
Anche in questo caso, consultare la guida per ulteriori approfondimenti.


Matrice.

Una matrice è un array di array.

Dopo aver creato una matrice è sempre possibile aggiungere elementi, specificando un indice, o una chiave, non ancora usati.

Nel seguente esempio, l'array $Biblio diventa una matrice:

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Elenco dei libri:</h1>

<?php

  echo "Creazione array con un elemento:<br />";

  $Biblio = array(0 => array("Autore"=>"Gianni Rodari", "Titolo"=>"il treno azzurro", "Note"=>"Avventure"));

  print_r($Biblio);

  echo "<br /><br />aggiunta di un altro elemento<br />";

  $Biblio[1]["Autore"] = "Alberto Manzi";

  $Biblio[1]["Titolo"] = "visita allo zoo";

  $Biblio[1]["Note"] = "da colorare";

  print_r($Biblio);

?>

</body>

</html>

Commenti al programma:

La variabile $Biblio è un array di array. È costituito da 1 riga e 3 colonne. Il primo indice di riga è 0.

Invia al browser tutti gli elementi della matrice tramite la funzione print_r.

Viene aggiunta una nuova riga alla matrice, con indice = 1, e vengono inizializzati i campi. Quindi vengono stampati tutti gli elementi della matrice $Biblio.


Disposizione dei dati in una tabella creata dinamicamente.

Nell'esempio seguente si invia al browser la sequenza di tag per costruire una tabella.

Inoltre si mostrano tre diverse tecniche per aggiungere un elemento all'array: se per un dato valore non viene specificata la chiave, al suo posto viene assunto il valore massimo dell'indice incrementato di 1. Se invece, per un valore, si specifica una chiave già esistente allora viene sovrascritto il valore.

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Risultati della ricerca:</h1>

<?php

  $Biblio = array(0 => array("Autore"=>"Gianni Rodari", "Titolo"=>"il treno azzurro","Note"=>"Avventure"));

  $Biblio[]["Autore"] = "Alberto Manzi";

  $Biblio[1]["Titolo"] = "visita allo zoo";

  $Biblio[1]["Note"] = "da colorare";

  $Biblio[]=array("Autore"=>"Eoin Colfer","Titolo"=>"Arthemis Fowl", "Note"=>"Poliziesco");

  $n = count($Biblio);

  echo "<table border=1><tr><td>Nr.</td><td>Autore</td><td>Titolo</td><td>Note</td></tr>";

  for ($i=0; $i<$n; $i++){

    print "<tr><td>" . $i ."</td><td>".$Biblio[$i]["Autore"]."</td><td>" .$Biblio[$i]["Titolo"] . "</td><td>".$Biblio[$i]["Note"]."</td></tr>";

  }

  echo "</table>";

?>

</body>

</html>

Commenti al programma:

Dopo aver creato il primo elemento dell'array si aggiunge un elemento senza specificare l'indice di riga, quindi PHP assegna il valore 1, perchè il più alto indice assegnato è l'indice 0.

Vengono assegnati i valori agli altri due campi del record aggiunto.

Nella creazione del terzo elemento si omette l'indice di riga, quindi il PHP assegna l'indice 2, e vengono inizializzati i campi del record, con la sintassi: array(chiave=>valore, …).

La funzione count() restituisce il numero di elementi dell'array.

Si inviano al browser i tag per la riga di intestazione di una tabella.

Per ciascun elemento della matrice vengono inviati al browser i tag per delimitare in una cella della tabella tutti i valori dei campi di ciascun record. In un'istruzione print, il segno "." ha la funzione di concatenare il testo con il contenuto di una variabile.


L'istruzione foreach.

Nel seguente esempio si mostra che per eliminare un elemento dall'array si deve usare unset(), specificando l'indice o la chiave corrispondente.

Intestazione della pagina:

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Risultati della ricerca:</h1>

Creazione della tabella:

<?php

  $Biblio = array("0" => array("Autore"=>"Gianni Rodari", "Titolo"=>"il treno azzurro", "Note"=>"Avventure"));

  $Biblio[]["Autore"] = "Alberto Manzi";

  $Biblio[1]["Titolo"] = "visita allo zoo";

  $Biblio[1]["Note"] = "da colorare";

  $Biblio[]=array("Autore"=>"Eoin Colfer","Titolo"=>"Arthemis Fowl", "Note"=>"Poliziesco");

Prima tecnica per accedere agli elementi della tabella:

Ogni elemento della tabella $Biblio as $j viene trattato come array associativo e si accede ai campi di una riga con $j["nomecampo"].

  $i = 0;

  echo "<table border=1><tr><td>Nr.</td><td>Autore</td><td>Titolo</td><td>Note</td>";

  foreach ($Biblio as $j){

    print "<tr><td>".$i++."</td><td>".$j["Autore"]."</td><td>".$j['Titolo']."</td><td>".$j['Note'] ."</td></tr>";

  }

  echo "</table>";

Seconda tecnica per accedere agli elementi della tabella:

  echo "<br />Seconda tecnica:<br />";

  echo "<table border=1><tr><td>Nr.</td><td>Autore</td><td>Titolo</td><td>Note</td>";

  foreach ($Biblio as $i => $k){

    echo "<tr><td>$i</td>";

    foreach ($k as $j){

      print "<td>$j</td>";

    }

  }

  echo "</table>";

Si elimina un elemento:

  echo "<br />Cancellazione del record 1<br />";

  unset($Biblio[1]);

  foreach ($Biblio as $k => $i) {

    print "<br />".$k.": ";

    foreach($i as $j){

      print $j." - ";

    }

  }

?>

</body>

</html>

Commenti al programma:

Il ciclo foreach è convenientemente usato con un array, e genera un errore se si tenta di utilizzarlo con variabili oppure con array non inizializzati. Esiste in due notazioni:
    foreach(nomeArray as $valore) istruzione
    foreach(nomeArray as $chiave => $valore) istruzione
Con la prima notazione si attraversa ordinatamente l'array nomeArray e, ad ogni ciclo, si assegna il valore dell'elemento corrente a $valore e si avanza il puntatore al successivo elemento dell'array.
Con la seconda, invece, ad ogni passaggio si assegna il valore dell'indice corrente alla variabile $chiave.

Per ogni indice dell'array si stampa un record (una riga)

si fa variare l'indice di riga e si scandiscono tutti gli elementi di una riga.

Si cancella la riga con indice 1.

Stampa per evidenziare che gli indici degli elementi rimasti sono invariati.

Per recuperare lo spazio lasciato libero dall'elemento eliminato, e ripristinare tutti gli indici a iniziare da 0 inserire, dopo la linea di eliminazione l'istruzione:

$Biblio = array_values($Biblio);

Ricerca in un array.

In questo esempio si costruisce un form per richiedere una ricerca all'interno di un archivio.

Si suppone che il form in cui specificare le condizioni di ricerca richieda l'inserimento dell'autore, del titolo, della lingua in cui è scritto il libro e, in particolare, se il titolo è esattamente quello desiderato o se si sta specificando una parte del titolo completo. L'archivio è organizzato in una tabella in memoria.

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Biblioteca</h1>

<h2>Modulo di consultazione del catalogo</h2>

<form action="CercaLibro.php" method="post">

<table>

<tr><td>Autore:</td><td><input type="text" name="Autore" /></td></tr>

<tr><td>Titolo:</td><td><input type="text" name="Titolo" />

<input type="checkbox" name="Interno" /> interno al titolo</td></tr>

<tr><td>Lingua:</td><td><input type="radio" name="Lingua" value="it" checked />italiano<br />

<input type="radio" name="Lingua" value="en" />inglese<br /></td></tr>

<tr><td></td><td><input type="submit" value="Cerca" /></td></tr>

</table>

</form>

</body>

</html>

Commenti:

I dati vengono inviati con il metodo post alla pagina cercalibro.php. Si ammette che si possa effettuare una ricerca per una parola contenuta nel titolo, a questo scopo è presente una casella di spunta. Il gruppo di radio button, invece, ha lo scopo di scegliere la lingua in cui è scritto il libro.

L'aspetto della pagina è il seguente:

Biblioteca

Modulo di consultazione del catalogo

Autore:
Titolo: interno al titolo
Lingua: italiano. inglese


Elaborazione lato server dei dati del form.

il file cercalibro.php

<html>

<head>

<title>Biblioteca</title>

</head>

<body>

<h1>Risultati della ricerca:</h1>

Viene dichiarata la tabella $Biblio. Alla chiave del primo elemento viene assegnato l'indice 0. Il primo elemento è un array di tre elementi le cui chiavi sono: "Autore", "Titolo", "Lingua".

Dopo la sua creazione, l'array $Biblio può essere ridimensionato dinamicamente: si possono aggiungere e cancellare righe. Vengono aggiunti altri elementi all'array. Nell'esempio non viene specificato l'indice, quindi agli indici verranno assegnati automaticamente valori progressivi crescenti a partire dall'ultimo indice assegnato.

<?php

  $Biblio = array(0 => array("Autore"=>"Gianni Rodari", "Titolo"=>"il treno azzurro", "Lingua"=>"it"));

  $Biblio[]=array("Autore"=>"Alberto Manzi","Titolo"=>"visita allo zoo", "Lingua"=>"it");

  $Biblio[]=array("Autore"=>"Eoin Colfer","Titolo"=>"Arthemis Fowl", "Lingua"=>"en");

  $Biblio[]=array("Autore"=>"J. K. Rowling","Titolo"=>"Harry Potter and the Deathbly Hallows", "Lingua"=>"en");

Vengono letti i parametri ricevuti con il metodo post

  $aut = $_POST["Autore"];

  $tit = $_POST["Titolo"];

  if (isset($_POST["Interno"]))

    $int = $_POST["Interno"];

  else $int="off";

    $lin = $_POST["Lingua"];

Si stampa la condizione di ricerca, poi si inizializza un contatore dei libri trovati e si stampa il numero di libri presenti in biblioteca:

  echo "ricerca di $aut - titolo: $tit - in lingua $lin<BR>";

  $conta=0;

  $n = count($Biblio);

  echo "<br />Libri presenti in biblioteca: ".$n;

Il risultato della ricerca viene disposto in una tabella.

L'istruzione foreach consente di esaminare tutti gli elementi dell'array $Biblio, indicando con $i la chiave e con $j il valore.

A seconda della condizione di ricerca (corrispondenza esatta del titolo o parte del titolo) vengono confrontati i valori di ciascun record della tabella con i parametri di ricerca.

La funzione strstr ricerca una sottostringa all'interno di una stringa e restituisce true se la trova.

La funzione strcmp confronta due stringhe e restituisce 0 se sono uguali.

  echo "<table border=1><tr><td>Nr.</td><td>Autore</td><td>Titolo</td><td>lingua</td>";

  foreach ($Biblio as $i => $j){

    if ($int=="on")

      $Ricerca=strstr($Biblio[$i]["Autore"], $aut) && strstr($Biblio[$i]["Titolo"],$tit) && strstr($Biblio[$i]["Lingua"],$lin);

    else

      $Ricerca=strstr($Biblio[$i]["Autore"], $aut) && strcmp($Biblio[$i]["Titolo"],$tit) && strstr($Biblio[$i]["Lingua"],$lin);

    if ($Ricerca) {

      $conta++;

      print "<tr><td>".$i."</td><td>".$Biblio[$i]["Autore"]."</td><td>" . $Biblio[$i]['Titolo'] . "</td><td>" . $Biblio[$i]['Lingua'] ."</td>";

    }

  }

  echo "<br> $conta risultati trovati";

?>

</body>

</html>