Comprensión de los Arrays Multidimensionales en PHP
Aprende a crear, acceder y recorrer arrays multidimensionales en PHP con ejemplos prácticos de código.
Un array multidimensional en PHP es un array cuyos elementos son a su vez arrays. Mientras que un array regular (indexado o asociativo) asigna a cada clave un único valor, un array multidimensional asigna a cada clave un array anidado completo, lo que te permite modelar datos en filas y columnas, cuadrículas, árboles y registros agrupados.
Este capítulo explica cómo crear arrays bidimensionales y de mayor profundidad, cómo leer y actualizar celdas individuales, cómo recorrerlos con foreach y las funciones más comunes para transformarlos. También señala los errores más frecuentes que cometen las personas al pasar de arrays planos a anidados.
¿Qué es un Array Multidimensional?
Un array se vuelve multidimensional en el momento en que uno de sus valores es otro array. La dimensión (o profundidad) es la cantidad de operaciones de índice que se necesitan para llegar a un valor escalar:
$a[0]llega a un valor → unidimensional$a[0][1]llega a un valor → bidimensional$a[0][1][2]llega a un valor → tridimensional, y así sucesivamente.
Un array bidimensional se visualiza a menudo como una tabla: el array externo contiene filas y cada array interno contiene las columnas de esa fila. Este modelo mental es útil, pero recuerda que los arrays de PHP son mapas ordenados, no cuadrículas rígidas: las filas pueden tener distintas longitudes y las claves pueden ser cadenas en lugar de 0, 1, 2. No existe un límite fijo de profundidad, aunque los datos muy anidados suelen ser una señal de que sería mejor usar objetos o una base de datos.
Creación de un Array Multidimensional
La forma más habitual es anidar literales de array. Cada array interno es un elemento del array externo.
Un array 2D de cadenas (una cuadrícula)
$grid = [
["value1", "value2", "value3"],
["value4", "value5", "value6"],
["value7", "value8", "value9"],
];En código real, los arrays internos suelen ser asociativos, de modo que cada fila se lee como un registro:
Una lista de registros
$employees = [
["name" => "Ann", "title" => "Engineer", "salary" => 65000],
["name" => "Bob", "title" => "Designer", "salary" => 58000],
["name" => "Cara", "title" => "Manager", "salary" => 72000],
];También puedes construirlo de forma incremental, lo que resulta útil cuando los datos provienen de un bucle o de una consulta a la base de datos:
$matrix = [];
$matrix[0][0] = 1;
$matrix[0][1] = 2;
$matrix[1][0] = 3;
$matrix[1][1] = 4;
// $matrix is now [[1, 2], [3, 4]]Acceso a los Elementos
Añade un conjunto de corchetes por dimensión. El primer índice selecciona el elemento externo (la fila); el segundo selecciona el elemento interno (la columna):
echo $grid[1][2]; // "value6" — row 1, column 2
echo $employees[2]["name"]; // "Cara"PHP usa índices base cero, por lo que la segunda fila es [1] y la tercera columna es [2]. Leer una clave que no existe genera una advertencia y devuelve null; usa isset() o el operador de fusión de null para estar seguro:
$salary = $employees[5]["salary"] ?? 0; // no warning if the row is missingRecorrer un Array Multidimensional
Los bucles foreach anidados son la forma idiomática de recorrer un array 2D: el bucle externo visita cada fila y el bucle interno visita los valores de esa fila:
$employees = [
["name" => "Ann", "salary" => 65000],
["name" => "Bob", "salary" => 58000],
];
foreach ($employees as $row) {
foreach ($row as $key => $value) {
echo "$key: $value\n";
}
echo "---\n";
}Para registros tabulares, suele ser más limpio desestructurar directamente las claves internas:
foreach ($employees as $emp) {
echo "{$emp['name']} earns {$emp['salary']}\n";
}
// Ann earns 65000
// Bob earns 58000Modificar Elementos
Asigna a través de la ruta completa de índices para actualizar una celda concreta, y añade una nueva fila con [] o con 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() elimina y devuelve la última fila, por lo que las dos operaciones anteriores se anulan entre sí.
Transformar con array_map y array_column
array_map() aplica un callback a cada elemento. Para transformar cada celda, mapea un array_map interno sobre cada fila:
Convertir a mayúsculas todos los valores de 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"]]Cuando los arrays internos son registros, array_column() extrae un campo concreto de cada fila en un array plano, lo que resulta perfecto para extraer una columna:
$employees = [
["name" => "Ann", "salary" => 65000],
["name" => "Bob", "salary" => 58000],
];
$names = array_column($employees, "name"); // ["Ann", "Bob"]
$total = array_sum(array_column($employees, "salary")); // 123000Errores Frecuentes
- Índices desfasados en uno.
$grid[1][2]es la segunda fila, tercera columna: ambos índices son base cero. - Confundir el orden de los índices.
$employees[0]["name"]funciona;$employees["name"][0]no, porque el array externo está indexado por enteros. - Claves indefinidas. Acceder a una fila o columna inexistente emite una advertencia y devuelve
null. Protégete conisset()o?? default. - Funciones que necesitan recursividad. El simple
count($arr)solo cuenta el nivel superior: usacount($arr, COUNT_RECURSIVE). Para recorrer cada hoja, usaarray_walk_recursive()en lugar dearray_walk(). - Semántica de copia. Los arrays de PHP se copian por valor, por lo que
$copy = $original;seguido de editar$copy[0][0]no modifica$original, a diferencia de las referencias a objetos.
Conclusión
Los arrays multidimensionales te permiten representar tablas, cuadrículas y registros agrupados anidando un array dentro de otro. Lee y escribe celdas individuales con índices [] encadenados, itera con bucles foreach anidados, y transforma datos con array_map(), array_column() y las funciones recursivas de array. Para un recorrido más amplio del conjunto de herramientas de arrays de PHP, consulta PHP Arrays.