Fundamentos

Arrays en PHP

Objetivos de Aprendizaje
  • Comprender qué son los arrays y los diferentes tipos en PHP
  • Aprender a crear y manipular arrays indexados
  • Conocer cómo funcionan los arrays asociativos
  • Entender los arrays multidimensionales y su utilidad
  • Dominar las principales funciones para trabajar con arrays

¿Qué es un Array?

Un array es una estructura de datos que permite almacenar múltiples valores bajo un único nombre de variable. En PHP, los arrays son increíblemente versátiles y pueden almacenar cualquier tipo de datos, incluso otros arrays.

Tipos de arrays en PHP
  • Arrays indexados: Usan números como índices
  • Arrays asociativos: Usan nombres de clave personalizados
  • Arrays multidimensionales: Arrays que contienen otros arrays

Arrays Indexados

Los arrays indexados utilizan números como índices. El primer elemento tiene el índice 0, el segundo tiene el índice 1, y así sucesivamente.

Crear un array indexado

Hay dos formas principales de crear arrays indexados:

ejemplo.php

<?php
$frutas = ["manzana", "naranja", "plátano"];

foreach ($frutas as $fruta) {
    echo $fruta . "<br>";
}
?>
                                

Recorrer un array indexado

Existen varias formas de recorrer los elementos de un array:

ejemplo.php

<?php
$frutas = ["manzana", "naranja", "plátano", "fresa"];

// Método 1: Bucle for
echo "Recorriendo con bucle for:<br>";
for ($i = 0; $i < count($frutas); $i++) {
    echo "Índice $i: " . $frutas[$i] . "<br>";
}

echo "<br>Recorriendo con foreach:<br>";
// Método 2: Bucle foreach (recomendado)
foreach ($frutas as $fruta) {
    echo $fruta . "<br>";
}

echo "<br>Recorriendo con foreach (con índices):<br>";
// Método 3: foreach con índices
foreach ($frutas as $indice => $fruta) {
    echo "Índice $indice: $fruta<br>";
}
?>
                                
Consejo: Para arrays indexados, el bucle foreach es más fácil de leer y menos propenso a errores que el bucle for.

Modificar arrays indexados

Puedes modificar, añadir y eliminar elementos de un array:

ejemplo.php

<?php
$frutas = ["manzana", "naranja", "plátano"];

// Modificar un elemento existente
$frutas[1] = "kiwi";  // Reemplaza "naranja" por "kiwi"

// Añadir un elemento al final
$frutas[] = "fresa";  // Añade "fresa" al final

// Añadir un elemento con la función array_push()
array_push($frutas, "uva");  // Añade "uva" al final

// Eliminar el último elemento
array_pop($frutas);  // Elimina "uva"

// Eliminar un elemento específico
unset($frutas[0]);  // Elimina "manzana" (¡pero no reordena los índices!)

// Mostrar el array resultante
echo "Array después de las modificaciones:<br>";
print_r($frutas);
?>
                                
Importante: Cuando usas unset() para eliminar un elemento de un array, los índices no se reordenan automáticamente. Si necesitas reordenar los índices, puedes usar array_values($array) después.

Arrays Asociativos

Los arrays asociativos utilizan claves personalizadas en lugar de índices numéricos. Esto permite acceder a los valores de forma más descriptiva.

Crear un array asociativo

ejemplo.php

<?php
// Crear un array asociativo
$persona = [
    "nombre" => "Juan",
    "edad" => 25,
    "ciudad" => "Madrid"
];

// Forma alternativa
$estudiante = array(
    "nombre" => "Ana",
    "carrera" => "Informática",
    "semestre" => 3
);

// Acceder a elementos específicos
echo "$persona[nombre] tiene $persona[edad] años y vive en $persona[ciudad]";
?>
                                

Recorrer un array asociativo

Para recorrer arrays asociativos, el bucle foreach es la mejor opción:

ejemplo.php

<?php
$persona = [
    "nombre" => "Juan",
    "edad" => 25,
    "ciudad" => "Madrid",
    "profesion" => "Desarrollador"
];

// Recorrer solo los valores
echo "Datos personales:<br>";
foreach ($persona as $valor) {
    echo "- $valor<br>";
}

// Recorrer claves y valores
echo "<br>Datos con etiquetas:<br>";
foreach ($persona as $clave => $valor) {
    echo ucfirst($clave) . ": $valor<br>";
}
?>
                                

Modificar arrays asociativos

ejemplo.php

<?php
$persona = [
    "nombre" => "Juan",
    "edad" => 25,
    "ciudad" => "Madrid"
];

// Modificar un valor existente
$persona["edad"] = 26;

// Añadir un nuevo par clave-valor
$persona["profesion"] = "Desarrollador";

// Eliminar un elemento
unset($persona["ciudad"]);

// Mostrar el array resultante
echo "Array modificado:<br>";
print_r($persona);
?>
                                

Arrays Multidimensionales

Los arrays multidimensionales son arrays que contienen otros arrays. Son útiles para representar estructuras de datos complejas como matrices, tablas o jerarquías.

Crear un array multidimensional

ejemplo.php

<?php
// Array multidimensional (matriz de estudiantes)
$estudiantes = [
    [
        "nombre" => "Ana López",
        "calificaciones" => [
            "matematicas" => 90,
            "historia" => 85,
            "ciencias" => 92
        ]
    ],
    [
        "nombre" => "Carlos Gómez",
        "calificaciones" => [
            "matematicas" => 78,
            "historia" => 89,
            "ciencias" => 76
        ]
    ]
];

// Acceder a los datos de un estudiante
$estudiante1 = $estudiantes[0];
echo "Estudiante: " . $estudiante1["nombre"] . "<br>";
echo "Matemáticas: " . $estudiante1["calificaciones"]["matematicas"] . "<br>";
echo "Historia: " . $estudiante1["calificaciones"]["historia"] . "<br>";
echo "Ciencias: " . $estudiante1["calificaciones"]["ciencias"] . "<br>";

// Forma directa de acceder a los datos
echo "<br>";
echo "Estudiante: " . $estudiantes[1]["nombre"] . "<br>";
echo "Matemáticas: " . $estudiantes[1]["calificaciones"]["matematicas"] . "<br>";
echo "Historia: " . $estudiantes[1]["calificaciones"]["historia"] . "<br>";
echo "Ciencias: " . $estudiantes[1]["calificaciones"]["ciencias"] . "<br>";
?>
                                

Recorrer arrays multidimensionales

Para recorrer arrays multidimensionales, se utilizan bucles foreach anidados:

ejemplo.php

<?php
// Array multidimensional
$productos = [
    "electronica" => [
        "televisores" => ["Samsung", "LG", "Sony"],
        "smartphones" => ["iPhone", "Samsung Galaxy", "Xiaomi"]
    ],
    "hogar" => [
        "muebles" => ["Sofá", "Mesa", "Silla"],
        "electrodomesticos" => ["Nevera", "Lavadora", "Microondas"]
    ]
];

// Recorrer el array multidimensional
foreach ($productos as $categoria => $subcategorias) {
    echo "<strong>Categoría: " . ucfirst($categoria) . "</strong><br>";
    
    foreach ($subcategorias as $subcategoria => $items) {
        echo "- " . ucfirst($subcategoria) . ": ";
        
        foreach ($items as $indice => $item) {
            echo $item;
            
            // Agregar coma si no es el último elemento
            if ($indice < count($items) - 1) {
                echo ", ";
            }
        }
        
        echo "<br>";
    }
    
    echo "<br>";
}
?>
                                

Funciones Útiles para Arrays

PHP proporciona numerosas funciones para manipular y trabajar con arrays:

Función Descripción Ejemplo
count($array) Cuenta el número de elementos count([1, 2, 3]) // 3
sort($array) Ordena un array (ascendente) sort($numeros)
rsort($array) Ordena un array (descendente) rsort($numeros)
array_push($array, $valor) Añade elementos al final array_push($frutas, "piña")
array_pop($array) Elimina y devuelve el último elemento $ultimo = array_pop($frutas)
array_shift($array) Elimina y devuelve el primer elemento $primero = array_shift($frutas)
array_unshift($array, $valor) Añade elementos al inicio array_unshift($frutas, "kiwi")
array_merge($array1, $array2) Fusiona dos o más arrays $fusion = array_merge($a, $b)
in_array($valor, $array) Comprueba si un valor existe in_array("manzana", $frutas)
array_search($valor, $array) Busca un valor y devuelve su clave $key = array_search("manzana", $frutas)
array_key_exists($clave, $array) Verifica si una clave existe array_key_exists("nombre", $persona)
array_sum($array) Suma los valores de un array numérico $suma = array_sum([1, 2, 3, 4])

Ejemplos de funciones para arrays

ejemplo.php

<?php
// Array original
$frutas = ["manzana", "naranja", "plátano", "fresa", "kiwi"];
echo "Array original: " . implode(", ", $frutas) . "<br><br>";

// Ordenar alfabéticamente
sort($frutas);
echo "Array ordenado: " . implode(", ", $frutas) . "<br>";

// Comprobar si existe un valor
$buscar = "manzana";
if (in_array($buscar, $frutas)) {
    echo "¿Existe la $buscar en el array? Sí<br>";
} else {
    echo "¿Existe la $buscar en el array? No<br>";
}

// Contar elementos
echo "Conteo de elementos: " . count($frutas) . "<br>";

// Sumar valores numéricos
$numeros = [10, 15, 5, 8, 17];
echo "Suma de números: " . array_sum($numeros) . "<br>";

// Fusionar arrays
$masFrutas = ["uva", "cereza"];
$todasFrutas = array_merge($frutas, $masFrutas);
echo "Todas las frutas: " . implode(", ", $todasFrutas) . "<br>";

// Eliminar duplicados
$numeros_duplicados = [1, 2, 2, 3, 4, 4, 5];
$numeros_unicos = array_unique($numeros_duplicados);
echo "Números únicos: " . implode(", ", $numeros_unicos) . "<br>";

// Obtener claves
$persona = ["nombre" => "Juan", "edad" => 25, "ciudad" => "Madrid"];
$claves = array_keys($persona);
echo "Claves del array persona: " . implode(", ", $claves) . "<br>";

// Obtener valores
$valores = array_values($persona);
echo "Valores del array persona: " . implode(", ", $valores);
?>
                                

Funciones Avanzadas para Arrays

PHP ofrece también funciones avanzadas para operaciones más complejas con arrays:

ejemplo.php

<?php
// Array de números
$numeros = [1, 2, 3, 4, 5];

// array_map(): aplica una función a cada elemento
$cuadrados = array_map(function($n) {
    return $n * $n;
}, $numeros);
echo "Números al cuadrado: " . implode(", ", $cuadrados) . "<br>";

// array_filter(): filtra elementos según una condición
$pares = array_filter($numeros, function($n) {
    return $n % 2 == 0;
});
echo "Números pares: " . implode(", ", $pares) . "<br>";

// array_reduce(): reduce el array a un solo valor
$suma = array_reduce($numeros, function($carry, $item) {
    return $carry + $item;
}, 0);
echo "Suma de números: $suma<br>";

// array_walk(): modifica cada elemento del array
$frutas = ["manzana", "naranja", "plátano"];
array_walk($frutas, function(&$value) {
    $value = ucfirst($value);
});
echo "Frutas con mayúscula: " . implode(", ", $frutas) . "<br>";

// array_slice(): extrae una porción del array
$porcion = array_slice($numeros, 1, 3);  // desde índice 1, 3 elementos
echo "Porción del array: " . implode(", ", $porcion) . "<br>";

// array_chunk(): divide un array en fragmentos
$grupos = array_chunk($numeros, 2);  // grupos de 2 elementos
echo "Array dividido en grupos:<br>";
foreach ($grupos as $grupo) {
    echo "- " . implode(", ", $grupo) . "<br>";
}
?>
                                
Ventajas de las funciones de orden superior: Funciones como array_map(), array_filter() y array_reduce() permiten escribir código más conciso y expresivo al trabajar con arrays.

Casos Prácticos con Arrays

Caso 1: Lista de tareas

ejemplo.php

<?php
// Lista de tareas con arrays
$tareas = [
    [
        "id" => 1,
        "titulo" => "Comprar víveres",
        "completada" => true,
        "fechaLimite" => "2025-05-05"
    ],
    [
        "id" => 2,
        "titulo" => "Pagar facturas",
        "completada" => false,
        "fechaLimite" => "2025-05-10"
    ],
    [
        "id" => 3,
        "titulo" => "Enviar informe",
        "completada" => false,
        "fechaLimite" => "2025-05-15"
    ]
];

// Mostrar todas las tareas
echo "<h4>Lista de tareas:</h4>";
echo "<ul>";
foreach ($tareas as $tarea) {
    $estado = $tarea["completada"] ? "completada" : "pendiente";
    $clase = $tarea["completada"] ? "text-decoration-line-through text-muted" : "";
    echo "<li class='$clase'>";
    echo $tarea["titulo"] . " - Estado: " . $estado . " (Fecha límite: " . $tarea["fechaLimite"] . ")</li>";
}
echo "</ul>";

// Filtrar tareas pendientes
$tareasPendientes = array_filter($tareas, function($tarea) {
    return !$tarea["completada"];
});

echo "<h4>Tareas pendientes:</h4>";
echo "<ul>";
foreach ($tareasPendientes as $tarea) {
    echo "<li>" . $tarea["titulo"] . " (Fecha límite: " . $tarea["fechaLimite"] . ")</li>";
}
echo "</ul>";

// Contar tareas completadas
$tareasCompletadas = array_filter($tareas, function($tarea) {
    return $tarea["completada"];
});

echo "<p>Tienes " . count($tareasPendientes) . " tareas pendientes y " . 
     count($tareasCompletadas) . " tareas completadas.</p>";
?>
                                

Caso 2: Cálculo de estadísticas

ejemplo.php

<?php
// Datos de ventas
$ventas = [
    "enero" => 15000,
    "febrero" => 22000,
    "marzo" => 18500,
    "abril" => 25000,
    "mayo" => 21000
];

// Total de ventas
$totalVentas = array_sum($ventas);
echo "<h4>Estadísticas de ventas:</h4>";
echo "Total de ventas: $" . number_format($totalVentas, 2) . "<br>";

// Promedio de ventas
$promedioVentas = $totalVentas / count($ventas);
echo "Promedio mensual: $" . number_format($promedioVentas, 2) . "<br>";

// Mes con mayores ventas
$mesMaximo = array_search(max($ventas), $ventas);
echo "Mes con mayores ventas: " . ucfirst($mesMaximo) . " con $" . number_format($ventas[$mesMaximo], 2) . "<br>";

// Mes con menores ventas
$mesMinimo = array_search(min($ventas), $ventas);
echo "Mes con menores ventas: " . ucfirst($mesMinimo) . " con $" . number_format($ventas[$mesMinimo], 2) . "<br>";

// Ordenar ventas (de mayor a menor)
arsort($ventas);
echo "<br><h5>Ventas ordenadas (mayor a menor):</h5>";
echo "<ul>";
foreach ($ventas as $mes => $cantidad) {
    echo "<li>" . ucfirst($mes) . ": $" . number_format($cantidad, 2) . "</li>";
}
echo "</ul>";

// Calcular porcentaje respecto al total
echo "<h5>Porcentaje sobre el total:</h5>";
echo "<ul>";
foreach ($ventas as $mes => $cantidad) {
    $porcentaje = ($cantidad / $totalVentas) * 100;
    echo "<li>" . ucfirst($mes) . ": " . number_format($porcentaje, 1) . "%</li>";
}
echo "</ul>";
?>
                                

Ejercicio Práctico

Sistema de calificaciones

Crea un sistema para gestionar calificaciones de estudiantes utilizando arrays:

  1. Define un array multidimensional llamado $estudiantes con al menos 3 estudiantes
  2. Para cada estudiante, guarda: nombre, edad y un array asociativo con las calificaciones de al menos 3 asignaturas
  3. Crea una función que calcule el promedio de calificaciones para cada estudiante
  4. Muestra un listado ordenado por nombre de los estudiantes con sus promedios
  5. Identifica y muestra al estudiante con el promedio más alto

Pistas:

  • Define el array así: $estudiantes = [ ["nombre" => "Ana", "edad" => 20, "calificaciones" => [...]], ... ];
  • Para calcular el promedio, usa array_sum() y count()
  • Para encontrar el estudiante con mayor promedio, recorre el array y guarda el mayor valor
  • Usa sort() o usort() para ordenar el array por nombre
  • Muestra los resultados en formato de tabla HTML para mejor presentación