Lezione 7 del corso PHP: un catalogo con dati sintetici per imparare array associativi, foreach, disponibilità e chiavi mancanti. Codice eseguito e risultati verificabili.
Gli array in PHP permettono di riunire dati collegati: per esempio codice prodotto, nome, prezzo e disponibilità. In questa lezione costruisci un piccolo catalogo e mostri soltanto i prodotti con scorta positiva, senza mantenere una variabile diversa per ogni articolo.
Risposta rapida. Usa un array associativo con lo SKU, il codice identificativo del prodotto, come chiave. Ogni valore contiene la scheda del prodotto. Con foreach leggi le schede e con if scegli quali mostrare. È un laboratorio per capire il flusso dei dati: per vendere davvero servono anche persistenza, validazione e gestione degli ordini.
È la lezione 7 del corso PHP RSWT. Riprende le condizioni della lezione 6 su if, else ed elseif e introduce foreach nel punto in cui serve. Se parti da zero, trovi il percorso nella prima lezione del corso PHP.
In breve: cosa trovi in questa guida
Array in PHP: indici, chiavi e schede prodotto
Un array collega chiavi e valori e conserva un ordine. Nel manuale ufficiale sugli array, PHP Documentation Group, consultato nel 2026, è descritto come una mappa ordinata. "Indicizzato" e "associativo" non sono due tipi PHP separati: descrivono il modo in cui scegli le chiavi.
| Struttura | Accesso | Uso nel catalogo |
|---|---|---|
| Array indicizzato | $nomi[0] | Una sequenza di nomi da leggere nell'ordine inserito |
| Array associativo | $prodotto['nome'] | Una scheda con campi riconoscibili |
| Array multidimensionale | $catalogo['SKU-A']['scorta'] | Una raccolta di schede, ciascuna identificata dal proprio codice |
Prova questo primo esempio in un file separato. Nella lista senza chiavi esplicite il primo indice è 0; le parentesi vuote aggiungono un elemento alla fine. count conta gli elementi del livello corrente. Su uno schermo stretto puoi scorrere orizzontalmente i riquadri del codice.
<?php
$nomi = ['Quaderno', 'Portapenne'];
echo $nomi[0] . PHP_EOL;
$nomi[] = 'Cartellina';
echo count($nomi) . PHP_EOL;
$prodotto = ['nome' => 'Quaderno', 'scorta' => 4];
echo $prodotto['scorta'] . PHP_EOL;L'output è Quaderno, poi 3, poi 4, ciascuno su una riga. Il 3 conta i nomi dopo l'aggiunta; il 4 è la scorta della singola scheda. La freccia => associa una chiave al suo valore.
Un catalogo completo, con dati sintetici
Prodotti, prezzi e quantità qui sotto sono inventati per l'esercizio. Non sono il listino Keidea, un magazzino cliente o un caso commerciale. Il catalogo comprende un prodotto esaurito: serve a verificare che il filtro faccia davvero il suo lavoro.
Per questo laboratorio abbiamo scelto codici SKU testuali e prezzi interi in centesimi. Lo SKU resta riconoscibile quando cambiano l'ordine o i prodotti mostrati; il prezzo può essere moltiplicato per una quantità intera senza introdurre decimali nel calcolo. La sezione Floating-point numbers del manuale PHP, consultata nel 2026, spiega perché i numeri a virgola mobile hanno precisione limitata.
Salva tutto il blocco seguente come catalogo.php, in UTF-8. Serve PHP disponibile nel terminale: se devi predisporlo, parti dalla lezione sull'ambiente di sviluppo. Il file produce testo nel terminale, non una pagina con carrello.
<?php
// Laboratorio RSWT: prodotti, prezzi e scorte sono dati sintetici.
$catalogo = [
'SKU-A' => [
'nome' => 'Quaderno da ufficio',
'prezzo_centesimi' => 2490,
'scorta' => 4,
],
'SKU-B' => [
'nome' => 'Portapenne',
'prezzo_centesimi' => 1790,
'scorta' => 0,
],
'SKU-C' => [
'nome' => 'Cartellina',
'prezzo_centesimi' => 590,
'scorta' => 10,
],
];
$disponibili = [];
$valoreCentesimi = 0;
foreach ($catalogo as $sku => $prodotto) {
if ($prodotto['scorta'] > 0) {
$disponibili[$sku] = $prodotto;
$valoreCentesimi +=
$prodotto['prezzo_centesimi'] * $prodotto['scorta'];
}
}
echo 'Prodotti a catalogo: ' . count($catalogo) . PHP_EOL;
echo 'Prodotti disponibili: ' . count($disponibili) . PHP_EOL;
foreach ($disponibili as $sku => $prodotto) {
$prezzo = number_format(
$prodotto['prezzo_centesimi'] / 100, 2, ',', '.'
);
echo $sku . ' | ' . $prodotto['nome'] . ' | '
. $prezzo . ' EUR | scorta: '
. $prodotto['scorta'] . PHP_EOL;
}
if ($disponibili === []) {
echo 'Nessun prodotto disponibile.' . PHP_EOL;
}
echo 'Valore teorico delle scorte a prezzo di vendita: '
. number_format($valoreCentesimi / 100, 2, ',', '.')
. ' EUR' . PHP_EOL;Nella cartella del file esegui:
php -v
php -l catalogo.php
php catalogo.phpIl primo comando mostra la versione, il secondo controlla la sintassi, il terzo esegue il programma. Output atteso:
Prodotti a catalogo: 3
Prodotti disponibili: 2
SKU-A | Quaderno da ufficio | 24,90 EUR | scorta: 4
SKU-C | Cartellina | 5,90 EUR | scorta: 10
Valore teorico delle scorte a prezzo di vendita: 158,60 EUR158,60 EUR è soltanto la somma dei prezzi dimostrativi moltiplicati per le scorte disponibili: 24,90 × 4 + 5,90 × 10. Non è fatturato, margine, costo del magazzino o una valorizzazione contabile. L'esempio non modella imposte, sconti, resi o costi di acquisto.
Leggere e filtrare il catalogo con foreach
Nel primo ciclo, a ogni passaggio $sku riceve il codice corrente e $prodotto riceve la scheda. Il manuale PHP su foreach, consultato nel 2026, documenta la forma chiave => valore usata qui. Non devi conoscere il numero di prodotti in anticipo né incrementare un contatore.
La condizione scorta > 0 decide se copiare la scheda in $disponibili. Manteniamo lo SKU anche nella raccolta filtrata: la chiave SKU-C continua a identificare la Cartellina. Il Portapenne rimane nel catalogo originale ma non appare nell'elenco disponibile.
Il secondo ciclo presenta i risultati. count($catalogo) conta tre schede; count($disponibili) ne conta due. Non stiamo contando i pezzi fisici, che nell'esempio disponibile sono quattordici. Distinguere queste misure evita un contatore "prodotti" ambiguo nell'interfaccia.
La conversione da centesimi a euro avviene soltanto quando si stampa. number_format, documentazione PHP consultata nel 2026, restituisce una stringa con due decimali, virgola decimale e punto delle migliaia. Non usare quella stringa formattata per continuare a calcolare: conserva $valoreCentesimi come valore numerico.
Aggiungere, modificare e rimuovere una scheda
Inserisci queste righe dopo la definizione di $catalogo e prima di $disponibili = []. In questo punto i risultati del filtro devono ancora essere calcolati. Non aggiungere un secondo tag di apertura PHP nello stesso file.
// Dopo la definizione di $catalogo, prima di calcolare $disponibili.
$catalogo['SKU-B']['scorta'] = 3;
$catalogo['SKU-D'] = [
'nome' => 'Etichette',
'prezzo_centesimi' => 350,
'scorta' => 6,
];
unset($catalogo['SKU-C']);Ora il Portapenne ha scorta 3, arriva SKU-D e SKU-C viene rimosso. Rieseguendo il file ottieni tre prodotti disponibili e un valore teorico di 174,30 EUR. Se applicassi le modifiche dopo il filtro, dovresti ricalcolare $disponibili: non è una vista che si aggiorna da sola.
Attenzione ai codici duplicati. Assegnare nuovamente una scheda a SKU-A sostituisce il valore già associato a quella chiave. Nel nostro test il conteggio è rimasto tre, senza creare un quarto prodotto. In un import reale verifica l'unicità dei codici prima di costruire la mappa: dopo la sovrascrittura il record precedente non è più recuperabile da quell'array.
Una chiave assente non è una scorta pari a zero
Per cercare un prodotto, controlla il codice prima di leggere la scheda. Questo frammento va in fondo al file, senza ripetere il tag di apertura PHP:
// Da aggiungere in fondo a catalogo.php.
$skuCercato = 'SKU-Z';
if (array_key_exists($skuCercato, $catalogo)) {
echo $catalogo[$skuCercato]['nome'] . PHP_EOL;
} else {
echo 'Prodotto non trovato.' . PHP_EOL;
}Con SKU-Z ottieni "Prodotto non trovato."; con SKU-A ottieni il nome del Quaderno. Il controllo riguarda il primo livello di $catalogo. Non dimostra che tutti i campi della scheda abbiano un formato valido.
Per distinguere una nota non compilata da una chiave che non esiste, esegui questo esempio indipendente:
<?php
$dati = ['scorta' => 0, 'nota' => null];
var_dump(isset($dati['scorta']));
var_dump(isset($dati['nota']));
var_dump(array_key_exists('nota', $dati));
var_dump(array_key_exists('sconto', $dati));I risultati sono true, false, true, false. isset considera presente una scorta pari a 0 ma restituisce false per null. array_key_exists riconosce la chiave nota anche con valore null. La distinzione è documentata dal PHP Documentation Group nella pagina array_key_exists, consultata nel 2026.
Nel laboratorio ogni scorta è un intero non negativo e ogni prezzo è un intero in centesimi. Se un file importato contiene "10 pezzi", una quantità negativa o un campo mancante, devi validarlo prima del ciclo. Non trasformare silenziosamente un valore sconosciuto in zero: perderesti la differenza tra "esaurito" e "dato da correggere".
Dal terminale alla pagina: proteggere il testo
Quando il nome finisce dentro un paragrafo HTML, i caratteri speciali devono essere rappresentati come testo. Questo esempio indipendente contiene un nome sintetico con parentesi angolari e una e commerciale:
<?php
// Esempio indipendente. Il nome è un dato sintetico.
$nome = 'Cartellina <A4> & accessori';
echo '<p>' . htmlspecialchars(
$nome, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'
) . '</p>';Il browser mostra "Cartellina <A4> & accessori". Le parentesi non diventano un tag. La funzione htmlspecialchars nel manuale PHP, consultato nel 2026, converte i caratteri speciali secondo le opzioni indicate. Qui il contesto è il testo dentro un paragrafo: non stiamo definendo una protezione valida per qualunque URL, query SQL o codice JavaScript.
Prove eseguite e limiti: quando serve un database
Verifica RSWT del 19 settembre 2026: abbiamo eseguito il codice con PHP 8.5.10 CLI compilato in WebAssembly, tramite @php-wasm/cli 3.1.54 in Node.js. È una prova del comportamento del linguaggio in un ambiente isolato, non un test del server di produzione o un benchmark prestazionale. Il codice PHP è riportato integralmente; il runtime serve solo a dichiarare come è stato verificato.
| Prova | Risultato verificato |
|---|---|
| Catalogo iniziale | 3 schede, 2 disponibili, 158,60 EUR teorici |
| Catalogo vuoto | 0 schede, messaggio di assenza prodotti, 0,00 EUR |
| Tutte le scorte a zero | 3 schede originali, nessuna disponibile |
| Modifica, aggiunta e rimozione | 3 disponibili, 174,30 EUR teorici |
| Codice cercato assente o presente | Messaggio di assenza oppure nome corretto |
| Chiave duplicata e valore null | Sostituzione della scheda; differenza tra isset e array_key_exists confermata |
| Nome con <A4> e & | Output HTML con caratteri convertiti correttamente |
Per ripetere la prova del vuoto, sostituisci soltanto la definizione iniziale con $catalogo = []; e lascia il resto del file. Per la prova delle disponibilità, rimetti il catalogo iniziale e porta tutte le scorte a 0. Il programma deve mostrare il messaggio di assenza prodotti, senza avvisi PHP.
Un array è utile per elaborare dati durante una richiesta, preparare un'esportazione o verificare una regola in un prototipo. Il solo array locale non conserva modifiche tra esecuzioni. Inoltre non coordina due acquisti contemporanei dell'ultimo pezzo: per quello serve progettare persistenza, transazioni e controlli sulla disponibilità.
Non esiste una soglia di righe universalmente valida oltre la quale "PHP non regge". Contano memoria, forma dei dati e lavoro svolto. Questo esempio duplica le schede disponibili in una seconda raccolta e non misura il consumo di un catalogo grande. In un'applicazione con molti record conviene valutare filtri e paginazione nel database invece di caricare tutto per poi scartarlo.
Esercizio finale: riparti dal catalogo originale, rendi disponibile SKU-B con scorta 3 e verifica che compaia con il suo codice. Poi cerca SKU-Z e controlla che l'assenza sia gestita. Se entrambe le prove passano, hai collegato dati, condizione e presentazione. Il passo successivo nel percorso sarà separare queste operazioni in funzioni riutilizzabili.