Capire gli Array Multidimensionali in PHP
PHP offre un ricco set di funzioni per gestire array e strutture dati. Gli array multidimensionali permettono di modellare tabelle, griglie e record.
Un array multidimensionale in PHP è un array i cui elementi sono a loro volta array. Mentre un array normale (indicizzato o associativo) associa ogni chiave a un singolo valore, un array multidimensionale associa ogni chiave a un intero array annidato — consentendo di modellare dati a righe e colonne, griglie, alberi e record raggruppati.
Questo capitolo illustra come creare array bidimensionali e più profondi, come leggere e aggiornare singole celle, come iterarli con foreach e le funzioni più comuni per trasformarli. Vengono inoltre indicati gli errori tipici in cui si incorre quando si passa dagli array piatti a quelli annidati.
Cos'è un Array Multidimensionale?
Un array diventa multidimensionale nel momento in cui uno dei suoi valori è a sua volta un array. La dimensione (o profondità) indica quante operazioni di indicizzazione sono necessarie per raggiungere un valore scalare:
$a[0]raggiunge un valore → unidimensionale$a[0][1]raggiunge un valore → bidimensionale$a[0][1][2]raggiunge un valore → tridimensionale, e così via.
Un array bidimensionale viene spesso immaginato come una tabella: l'array esterno contiene le righe e ciascun array interno contiene le colonne di quella riga. Questo modello mentale è utile, ma occorre ricordare che gli array PHP sono mappe ordinate, non griglie rigide — le righe possono avere lunghezze diverse e le chiavi possono essere stringhe invece di 0, 1, 2. Non esiste un limite fisso alla profondità, anche se i dati molto annidati segnalano solitamente la necessità di oggetti o di un database.
Creare un Array Multidimensionale
Il modo più comune è annidare letterali di array. Ogni array interno è un elemento dell'array esterno.
Un array 2D di stringhe (una griglia)
$grid = [
["value1", "value2", "value3"],
["value4", "value5", "value6"],
["value7", "value8", "value9"],
];Nel codice reale gli array interni sono solitamente associativi, così ogni riga si legge come un record:
Un elenco di record
$employees = [
["name" => "Ann", "title" => "Engineer", "salary" => 65000],
["name" => "Bob", "title" => "Designer", "salary" => 58000],
["name" => "Cara", "title" => "Manager", "salary" => 72000],
];È anche possibile costruirlo in modo incrementale, utile quando i dati provengono da un ciclo o da una query al database:
$matrix = [];
$matrix[0][0] = 1;
$matrix[0][1] = 2;
$matrix[1][0] = 3;
$matrix[1][1] = 4;
// $matrix is now [[1, 2], [3, 4]]Accedere agli Elementi
Aggiungere un set di parentesi quadre per ogni dimensione. Il primo indice seleziona l'elemento esterno (la riga); il secondo seleziona l'elemento interno (la colonna):
echo $grid[1][2]; // "value6" — row 1, column 2
echo $employees[2]["name"]; // "Cara"PHP è indicizzato a zero, quindi la seconda riga è [1] e la terza colonna è [2]. Leggere una chiave inesistente genera un avviso e restituisce null; usare isset() o l'operatore null-coalescing per rimanere al sicuro:
$salary = $employees[5]["salary"] ?? 0; // no warning if the row is missingIterare su un Array Multidimensionale
I cicli foreach annidati sono il modo idiomatico per percorrere un array 2D — il ciclo esterno visita ogni riga, quello interno i valori di quella riga:
$employees = [
["name" => "Ann", "salary" => 65000],
["name" => "Bob", "salary" => 58000],
];
foreach ($employees as $row) {
foreach ($row as $key => $value) {
echo "$key: $value\n";
}
echo "---\n";
}Per i record tabulari è spesso più pulito destrutturare direttamente le chiavi interne:
foreach ($employees as $emp) {
echo "{$emp['name']} earns {$emp['salary']}\n";
}
// Ann earns 65000
// Bob earns 58000Modificare gli Elementi
Assegnare attraverso il percorso di indice completo per aggiornare una singola cella, e aggiungere una nuova riga con [] o array_push():
$employees[0]["salary"] = 70000; // update one field
$employees[] = ["name" => "Dan", "salary" => 60000]; // add a row
array_pop($employees); // remove the last rowarray_pop() rimuove e restituisce l'ultima riga, quindi le due operazioni precedenti si annullano a vicenda.
Trasformare con array_map e array_column
array_map() applica una callback a ogni elemento. Per trasformare ogni cella, mappare un array_map interno su ogni riga:
Convertire in maiuscolo ogni valore in un array 2D
$grid = [["a", "b"], ["c", "d"]];
$upper = array_map(function ($row) {
return array_map("strtoupper", $row);
}, $grid);
// $upper is [["A", "B"], ["C", "D"]]Quando gli array interni sono record, array_column() estrae un singolo campo da ogni riga in un array piatto — perfetto per estrarre una colonna:
$employees = [
["name" => "Ann", "salary" => 65000],
["name" => "Bob", "salary" => 58000],
];
$names = array_column($employees, "name"); // ["Ann", "Bob"]
$total = array_sum(array_column($employees, "salary")); // 123000Errori Comuni
- Indici sfasati di uno.
$grid[1][2]è la seconda riga, terza colonna — entrambi gli indici sono a base zero. - Confondere l'ordine degli indici.
$employees[0]["name"]funziona;$employees["name"][0]no, perché l'array esterno è indicizzato da interi. - Chiavi non definite. Accedere a una riga o colonna mancante emette un avviso e restituisce
null. Proteggere conisset()o?? default. - Funzioni che richiedono ricorsione. Il semplice
count($arr)conta solo il livello superiore — usarecount($arr, COUNT_RECURSIVE). Per percorrere ogni foglia, usarearray_walk_recursive()invece diarray_walk(). - Semantica di copia. Gli array PHP vengono copiati per valore, quindi
$copy = $original;seguito dalla modifica di$copy[0][0]non cambia$original— a differenza dei riferimenti a oggetti.
Conclusione
Gli array multidimensionali consentono di rappresentare tabelle, griglie e record raggruppati annidando un array all'interno di un altro. Leggere e scrivere singole celle con indici [] concatenati, iterare con cicli foreach annidati, e rimodellare i dati con array_map(), array_column() e le funzioni ricorsive per array. Per una panoramica più ampia del toolkit array di PHP, vedere PHP Arrays.