W3docs

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 missing

Iterare 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 58000

Modificare 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 row

array_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")); // 123000

Errori 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 con isset() o ?? default.
  • Funzioni che richiedono ricorsione. Il semplice count($arr) conta solo il livello superiore — usare count($arr, COUNT_RECURSIVE). Per percorrere ogni foglia, usare array_walk_recursive() invece di array_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.

Pratica

Pratica
Cosa sono gli array multidimensionali in PHP?
Cosa sono gli array multidimensionali in PHP?
Was this page helpful?