PHP 8 — Array

Indicizzati e associativi · array_map/filter/reduce · sort · PHP 8.5 · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
📋 Array indicizzati — una lista ordinata di valori
Un array indicizzato è una lista ordinata dove ogni elemento ha una posizione numerica, a partire da 0 — stesso concetto degli array JavaScript già visti, ma con sintassi PHP.
<?php $corsi = ["HTML", "CSS", "PHP"]; echo $corsi[0]; // → HTML (il primo elemento ha indice 0) echo $corsi[2]; // → PHP echo count($corsi); // → 3 (numero di elementi, equivalente a .length in JS) $corsi[] = "MySQL"; // aggiunge in fondo, senza specificare l'indice print_r($corsi); // → Array ( [0] => HTML [1] => CSS [2] => PHP [3] => MySQL ) ?>
💡 print_r() è lo strumento di debug ideale per gli array: mostra la struttura completa in modo leggibile — molto più utile di echo su un array, che produrrebbe solo la parola "Array".
🏷️ Array associativi — chiavi testuali invece di numeri
Un array associativo usa chiavi testuali invece di indici numerici — l'equivalente PHP dell'Object di JavaScript (guida già vista), utile per rappresentare un'entità con proprietà nominate.
<?php $studente = [ "nome" => "Marco", "corso" => "Full Stack", "voto" => 28 ]; echo $studente["nome"]; // → Marco $studente["voto"] = 30; // modifica un valore esistente $studente["attivo"] = true; // aggiunge una nuova chiave ?>
⚠️ A differenza di JavaScript (dove array e oggetti sono due tipi distinti), PHP usa lo stesso tipo array sia per liste indicizzate che per coppie chiave-valore — la distinzione è solo nel modo in cui lo popoli.
🔑 array_key_exists() e isset() — verificare la presenza di una chiave
<?php $studente = ["nome" => "Marco", "voto" => null]; var_dump(isset($studente["voto"])); // → false! isset() considera null come "assente" var_dump(array_key_exists("voto", $studente)); // → true, la chiave esiste anche se il valore è null ?>
⚠️ Trabocchetto comune: isset() restituisce false anche se la chiave esiste ma il suo valore è null. Per verificare la sola ESISTENZA della chiave (indipendentemente dal valore), serve array_key_exists().
🔄 array_map() — trasformare ogni elemento
array_map() applica una funzione a ogni elemento dell'array e restituisce un nuovo array con i risultati — concettualmente identico al map() di JavaScript, ma con la funzione passata come primo argomento invece che come metodo.
<?php $prezzi = [10, 20, 30]; $prezziConIva = array_map(fn(float $p): float => $p * 1.22, $prezzi); print_r($prezziConIva); // → [12.2, 24.4, 36.6] ?>
💡 Nota l'ordine degli argomenti: in PHP la funzione va prima, l'array dopo — array_map(funzione, array) — l'opposto dell'ordine "intuitivo" di JavaScript array.map(funzione).
🎯 array_filter() — selezionare solo alcuni elementi
<?php $voti = [18, 25, 12, 30]; $promossi = array_filter($voti, fn(int $v): bool => $v >= 18); print_r($promossi); // → Array ( [0] => 18 [1] => 25 [3] => 30 ) — nota gli INDICI ORIGINALI preservati! $promossi = array_values($promossi); // riordina gli indici da 0, se serve una lista pulita ?>
⚠️ Trabocchetto specifico di PHP: array_filter() mantiene gli indici ORIGINALI degli elementi rimasti (qui: 0, 1, 3 — manca il 2, scartato) invece di rinumerarli da 0 come farebbe .filter() in JavaScript. Usa array_values() per "compattare" gli indici se serve una lista pulita.
🧮 array_reduce() — condensare l'array in un unico valore
Come il reduce() di JavaScript, array_reduce() "riduce" l'intero array a un singolo valore accumulato — ma con l'ordine degli argomenti della callback invertito rispetto a JS.
<?php $prezzi = [10, 20, 30]; $totale = array_reduce( $prezzi, fn(float $accumulatore, float $valoreCorrente): float => $accumulatore + $valoreCorrente, 0 // valore iniziale dell'accumulatore, terzo argomento ); echo $totale; // → 60 ?>
💡 In PHP l'ordine è: array_reduce(array, funzione, valoreIniziale) — la callback riceve (accumulatore, elementoCorrente), esattamente come in JavaScript, ma qui l'array e il valore iniziale sono argomenti separati della funzione, non un metodo chiamato sull'array.
🔀 sort() e le sue varianti
<?php $numeri = [40, 5, 100, 25]; sort($numeri); // ordina CRESCENTE, modifica direttamente $numeri (per riferimento) print_r($numeri); // → [5, 25, 40, 100] rsort($numeri); // ordina DECRESCENTE // print_r($numeri); → [100, 40, 25, 5] $studente = ["voto" => 28, "nome" => "Marco"]; ksort($studente); // ordina un array associativo per CHIAVE alfabetica ?>
⚠️ A differenza di JavaScript (dove sort() restituisce un nuovo array o richiede una funzione di confronto per i numeri), sort() in PHP ordina numeri correttamente di default e modifica l'array originale direttamente ("by reference"), senza restituire un nuovo array.
🔁 foreach — il ciclo dedicato agli array
<?php $corsi = ["HTML", "CSS", "PHP"]; foreach ($corsi as $corso) { echo $corso . "\n"; } $studente = ["nome" => "Marco", "voto" => 28]; foreach ($studente as $chiave => $valore) { echo "$chiave: $valore\n"; } // → nome: Marco // → voto: 28 ?>
✅ foreach è il ciclo standard per gli array in PHP — funziona sia per array indicizzati (as $valore) sia per array associativi (as $chiave => $valore), unificando i concetti di for-of e for-in visti in JavaScript.
📦 Array multidimensionali — array dentro array
Un array può contenere altri array come valori — utile per rappresentare collezioni di entità complesse, come una lista di prodotti con più proprietà ciascuno.
<?php $prodotti = [ ["nome" => "Mouse", "prezzo" => 15], ["nome" => "Tastiera", "prezzo" => 40] ]; echo $prodotti[0]["nome"]; // → Mouse (primo prodotto, chiave 'nome') foreach ($prodotti as $prodotto) { echo "{$prodotto['nome']}: {$prodotto['prezzo']}€\n"; } ?>
💡 Questo pattern (array di array associativi) è esattamente ciò che ricevi tipicamente da una query MySQL (guida dedicata): ogni "riga" della tabella diventa un array associativo, e l'insieme dei risultati è un array di questi array.