Arrays Multidimensionales
Los arrays multidimensionales son arrays que contienen otros arrays. Son fundamentales para representar datos tabulares, listas de objetos, configuraciones anidadas y muchas otras estructuras de datos complejas.
Arrays de dos dimensiones (matrices)
Un array bidimensional es como una tabla con filas y columnas. Cada elemento del array principal contiene otro array.
<?php
// Matriz numérica (como una hoja de cálculo)
$matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// Acceder a elementos: $matriz[fila][columna]
echo $matriz[0][0]; // 1 (primera fila, primera columna)
echo $matriz[1][2]; // 6 (segunda fila, tercera columna)
echo $matriz[2][1]; // 8 (tercera fila, segunda columna)
// Modificar un elemento
$matriz[1][1] = 50;
// Visualizar la matriz
foreach ($matriz as $fila) {
echo implode(' | ', $fila) . "\n";
}
// 1 | 2 | 3
// 4 | 50 | 6
// 7 | 8 | 9
Lista de registros (muy común)
El uso más frecuente de arrays multidimensionales es almacenar listas de objetos o registros, como usuarios o productos.
<?php
// Lista de usuarios (array de arrays asociativos)
$usuarios = [
[
'id' => 1,
'nombre' => 'Ana García',
'email' => 'ana@ejemplo.com',
'rol' => 'admin'
],
[
'id' => 2,
'nombre' => 'Luis Martín',
'email' => 'luis@ejemplo.com',
'rol' => 'editor'
],
[
'id' => 3,
'nombre' => 'María López',
'email' => 'maria@ejemplo.com',
'rol' => 'usuario'
]
];
// Acceder a un usuario específico
echo $usuarios[0]['nombre']; // Ana García
echo $usuarios[1]['email']; // luis@ejemplo.com
// Recorrer la lista
foreach ($usuarios as $usuario) {
echo "{$usuario['nombre']} ({$usuario['rol']})\n";
}
// Ana García (admin)
// Luis Martín (editor)
// María López (usuario)
// Añadir un nuevo usuario
$usuarios[] = [
'id' => 4,
'nombre' => 'Pedro Ruiz',
'email' => 'pedro@ejemplo.com',
'rol' => 'usuario'
];
Recorrer con índices
<?php
$productos = [
['nombre' => 'Laptop', 'precio' => 999, 'stock' => 5],
['nombre' => 'Mouse', 'precio' => 29, 'stock' => 50],
['nombre' => 'Teclado', 'precio' => 79, 'stock' => 25]
];
// Con índice numérico
foreach ($productos as $indice => $producto) {
echo ($indice + 1) . ". {$producto['nombre']} - {$producto['precio']}€\n";
}
// 1. Laptop - 999€
// 2. Mouse - 29€
// 3. Teclado - 79€
// Recorrer con for
$total = count($productos);
for ($i = 0; $i < $total; $i++) {
echo $productos[$i]['nombre'] . "\n";
}
// Recorrer matriz numérica
$matriz = [
[1, 2, 3],
[4, 5, 6]
];
for ($fila = 0; $fila < count($matriz); $fila++) {
for ($col = 0; $col < count($matriz[$fila]); $col++) {
echo "[$fila][$col] = {$matriz[$fila][$col]}\n";
}
}
Estructuras anidadas profundas
<?php
// Estructura de una tienda online
$tienda = [
'nombre' => 'TechStore',
'categorias' => [
[
'id' => 1,
'nombre' => 'Ordenadores',
'productos' => [
['id' => 101, 'nombre' => 'Laptop Pro', 'precio' => 1299],
['id' => 102, 'nombre' => 'Desktop Gaming', 'precio' => 899]
]
],
[
'id' => 2,
'nombre' => 'Accesorios',
'productos' => [
['id' => 201, 'nombre' => 'Mouse RGB', 'precio' => 49],
['id' => 202, 'nombre' => 'Teclado Mecánico', 'precio' => 129],
['id' => 203, 'nombre' => 'Monitor 27"', 'precio' => 299]
]
]
]
];
// Acceder a datos anidados
echo $tienda['nombre']; // TechStore
echo $tienda['categorias'][0]['nombre']; // Ordenadores
echo $tienda['categorias'][1]['productos'][0]['precio']; // 49
// Recorrer toda la estructura
foreach ($tienda['categorias'] as $categoria) {
echo "\n{$categoria['nombre']}:\n";
foreach ($categoria['productos'] as $producto) {
echo " - {$producto['nombre']}: {$producto['precio']}€\n";
}
}
/*
Ordenadores:
- Laptop Pro: 1299€
- Desktop Gaming: 899€
Accesorios:
- Mouse RGB: 49€
- Teclado Mecánico: 129€
- Monitor 27": 299€
*/
Si tu estructura tiene más de 3-4 niveles de profundidad, considera usar clases/objetos en su lugar. Son más fáciles de mantener y documentar.
Buscar en arrays multidimensionales
<?php
$usuarios = [
['id' => 1, 'nombre' => 'Ana', 'email' => 'ana@ejemplo.com'],
['id' => 2, 'nombre' => 'Luis', 'email' => 'luis@ejemplo.com'],
['id' => 3, 'nombre' => 'María', 'email' => 'maria@ejemplo.com']
];
// Buscar usuario por ID
function buscarPorId(array $usuarios, int $id): ?array
{
foreach ($usuarios as $usuario) {
if ($usuario['id'] === $id) {
return $usuario;
}
}
return null;
}
$usuario = buscarPorId($usuarios, 2);
echo $usuario['nombre']; // Luis
// Extraer una columna de todos los registros
$emails = array_column($usuarios, 'email');
print_r($emails); // ['ana@ejemplo.com', 'luis@ejemplo.com', 'maria@ejemplo.com']
// Extraer columna como array asociativo
$usuariosPorId = array_column($usuarios, null, 'id');
print_r($usuariosPorId);
/*
Array
(
[1] => Array ( [id] => 1, [nombre] => Ana, ... )
[2] => Array ( [id] => 2, [nombre] => Luis, ... )
[3] => Array ( [id] => 3, [nombre] => María, ... )
)
*/
// Ahora puedes acceder directamente por ID
echo $usuariosPorId[2]['nombre']; // Luis
Modificar registros
<?php
$productos = [
['id' => 1, 'nombre' => 'Laptop', 'precio' => 999, 'stock' => 5],
['id' => 2, 'nombre' => 'Mouse', 'precio' => 29, 'stock' => 50],
['id' => 3, 'nombre' => 'Teclado', 'precio' => 79, 'stock' => 25]
];
// Modificar con referencia
foreach ($productos as &$producto) {
$producto['precio'] *= 1.1; // Aumentar 10%
}
unset($producto); // ¡Importante!
// Modificar producto específico
$productos[1]['stock'] = 45;
// Aplicar descuento a productos caros
foreach ($productos as $i => $producto) {
if ($producto['precio'] > 100) {
$productos[$i]['descuento'] = true;
}
}
// Eliminar un producto por ID
$idEliminar = 2;
foreach ($productos as $i => $producto) {
if ($producto['id'] === $idEliminar) {
unset($productos[$i]);
break;
}
}
// Reindexar
$productos = array_values($productos);
Filtrar registros
<?php
$productos = [
['nombre' => 'Laptop', 'precio' => 999, 'stock' => 5],
['nombre' => 'Mouse', 'precio' => 29, 'stock' => 0],
['nombre' => 'Teclado', 'precio' => 79, 'stock' => 25],
['nombre' => 'Monitor', 'precio' => 299, 'stock' => 0]
];
// Filtrar productos con stock
$conStock = array_filter($productos, fn($p) => $p['stock'] > 0);
print_r($conStock);
// Filtrar por precio
$baratos = array_filter($productos, fn($p) => $p['precio'] < 100);
// Filtrar por múltiples condiciones
$disponibles = array_filter($productos, function($p) {
return $p['stock'] > 0 && $p['precio'] < 500;
});
// Obtener solo los nombres
$nombres = array_map(fn($p) => $p['nombre'], $productos);
print_r($nombres); // ['Laptop', 'Mouse', 'Teclado', 'Monitor']
// Calcular precio total del inventario
$total = array_reduce($productos, function($suma, $p) {
return $suma + ($p['precio'] * $p['stock']);
}, 0);
echo "Valor total: $total€";
Generar HTML con arrays multidimensionales
<?php
$productos = [
['nombre' => 'Laptop', 'precio' => 999, 'stock' => 5],
['nombre' => 'Mouse', 'precio' => 29, 'stock' => 50],
['nombre' => 'Teclado', 'precio' => 79, 'stock' => 25]
];
?>
<table class="tabla-productos">
<thead>
<tr>
<th>Producto</th>
<th>Precio</th>
<th>Stock</th>
</tr>
</thead>
<tbody>
<?php foreach ($productos as $producto): ?>
<tr>
<td><?= htmlspecialchars($producto['nombre']) ?></td>
<td><?= $producto['precio'] ?>€</td>
<td class="<?= $producto['stock'] === 0 ? 'sin-stock' : '' ?>">
<?= $producto['stock'] ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
Trabajar con JSON
<?php
// Convertir array a JSON
$datos = [
'usuarios' => [
['id' => 1, 'nombre' => 'Ana'],
['id' => 2, 'nombre' => 'Luis']
],
'total' => 2
];
$json = json_encode($datos);
echo $json;
// {"usuarios":[{"id":1,"nombre":"Ana"},{"id":2,"nombre":"Luis"}],"total":2}
// Con formato legible
$jsonBonito = json_encode($datos, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $jsonBonito;
// Convertir JSON a array
$jsonString = '{"nombre":"Pedro","edad":30,"ciudades":["Madrid","Barcelona"]}';
$array = json_decode($jsonString, true); // true = devuelve array, no objeto
echo $array['nombre']; // Pedro
echo $array['ciudades'][0]; // Madrid
// Verificar errores de JSON
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Error al parsear JSON: ' . json_last_error_msg();
}
Ejercicios
Ejercicio 1: Recorrer lista de productos
Dado el array de productos, recorrelo e imprime cada producto en formato "Nombre: precio€".
$productos = [
['nombre' => 'Laptop', 'precio' => 999],
['nombre' => 'Mouse', 'precio' => 29],
['nombre' => 'Teclado', 'precio' => 79]
];
Ver solucion
<?php
declare(strict_types=1);
$productos = [
['nombre' => 'Laptop', 'precio' => 999],
['nombre' => 'Mouse', 'precio' => 29],
['nombre' => 'Teclado', 'precio' => 79]
];
foreach ($productos as $producto) {
echo "{$producto['nombre']}: {$producto['precio']}€\n";
}
Ejercicio 2: Calcular total de precios
Usando el mismo array de productos del ejercicio anterior, calcula la suma total de todos los precios.
Ver solucion
<?php
declare(strict_types=1);
$productos = [
['nombre' => 'Laptop', 'precio' => 999],
['nombre' => 'Mouse', 'precio' => 29],
['nombre' => 'Teclado', 'precio' => 79]
];
$total = 0;
foreach ($productos as $producto) {
$total += $producto['precio'];
}
echo "Total: {$total}€\n";
Ejercicio 3: Extraer columna con array_column
Dado el array de usuarios, usa array_column para extraer solo los nombres en un nuevo array e imprimelo.
$usuarios = [
['id' => 1, 'nombre' => 'Ana', 'email' => 'ana@test.com'],
['id' => 2, 'nombre' => 'Luis', 'email' => 'luis@test.com'],
['id' => 3, 'nombre' => 'Maria', 'email' => 'maria@test.com']
];
Ver solucion
<?php
declare(strict_types=1);
$usuarios = [
['id' => 1, 'nombre' => 'Ana', 'email' => 'ana@test.com'],
['id' => 2, 'nombre' => 'Luis', 'email' => 'luis@test.com'],
['id' => 3, 'nombre' => 'Maria', 'email' => 'maria@test.com']
];
$nombres = array_column($usuarios, 'nombre');
print_r($nombres);
// ['Ana', 'Luis', 'Maria']
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales y soporte personalizado.
Descubrir cursos premium