Lección 16 de 75 15 min de lectura

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
<?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
<?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
<?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
<?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€
*/
Evita anidación excesiva

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
<?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
<?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
<?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
<?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
<?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']

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium