Arrays y manejo de datos
En PHP el array es la estructura de datos cotidiana: lista indexada o mapa clave → valor. El capítulo 2 solo los nombró; aquí se recorre, se muta y se transforma. Sigue el ejemplo de líneas de pedido.
Documentación oficial: arrays, array_map, array_filter, array_reduce, ordenación.
Indexados y asociativos
<?php
$skus = ['CAM-01', 'PANT-02', 'ZAP-03']; // 0, 1, 2
$linea = [
'sku' => 'CAM-01',
'unidades' => 2,
'precio' => 19.9,
];
echo $skus[0], "\n";
echo $linea['sku'], "\n";Mezclar ambos en el mismo array es legal y casi siempre una mala idea. Acceder a una clave que no existe avisa (Warning) y produce null; con ?? evitas el aviso: $linea['descuento'] ?? 0.
Añadir, quitar, recorrer
<?php
$pedido = [
['sku' => 'CAM-01', 'unidades' => 2, 'precio' => 19.9],
['sku' => 'PANT-02', 'unidades' => 1, 'precio' => 39.0],
];
$pedido[] = ['sku' => 'ZAP-03', 'unidades' => 1, 'precio' => 54.5]; // al final
$pedido[0]['unidades'] = 3;
unset($pedido[1]); // el índice 1 desaparece; no “compacta”
foreach ($pedido as $i => $linea) {
echo $i, ' ', $linea['sku'], "\n";
}unset no reindexa. Si necesitas 0..n consecutivos: array_values($pedido).
Ordenar
Las sort / asort / ksort (y sus primas r*) mutan el array. asort mantiene claves y ordena por valor; ksort por clave. Para una lista de líneas, suele ser más claro usort:
<?php
usort($pedido, function (array $a, array $b): int {
return $a['sku'] <=> $b['sku'];
});<=> (nave) devuelve -1, 0 o 1. usort reindexa.
Transformar: foreach frente a map/filter/reduce
| Herramienta | Cuándo |
|---|---|
foreach | Varios pasos, early break, o mutar con claridad. |
array_map | Una función pura: cada elemento → otro. |
array_filter | Quedarte un subconjunto. El callback false descarta. |
array_reduce | Acumular un único resultado (total, string, otro array). |
foreach no es “menos PHP 8”. Las funciones de array brillan cuando el callback cabe en una línea y no necesitas el índice para otra estructura.
<?php
declare(strict_types=1);
$pedido = [
['sku' => 'CAM-01', 'unidades' => 2, 'precio' => 19.9],
['sku' => 'PANT-02', 'unidades' => 0, 'precio' => 39.0],
['sku' => 'ZAP-03', 'unidades' => 1, 'precio' => 54.5],
];
$conStock = array_filter(
$pedido,
fn (array $l): bool => $l['unidades'] > 0,
);
$importes = array_map(
fn (array $l): float => $l['unidades'] * $l['precio'],
$conStock,
);
$total = array_reduce(
$importes,
fn (float $acc, float $n): float => $acc + $n,
0.0,
);
echo $total, "\n";array_filter conserva claves. Si luego haces json_encode de una lista, reindexa con array_values($conStock) o el JSON saldrá objeto ({"0":..., "2":...}).
Equivalente con foreach (mejor si mañana añades logs o varias acumulaciones):
$total = 0.0;
foreach ($pedido as $linea) {
if ($linea['unidades'] <= 0) {
continue;
}
$total += $linea['unidades'] * $linea['precio'];
}Errores habituales
- Asumir que
foreachpor valor te deja mutar el array original (foreach ($pedido as &$linea)es fácil de olvidar el&y de dejar la referencia viva: si lo usas,unset($linea)después). array_filtersinarray_valuesy un JSON inesperado.sort()sobre una lista asociativa y perder las claves que te importaban (asort/usort).- Copiar el snippet
$data = ['id' => 1, 'name' => 'Ejemplo']como “modelo de dominio”.
Buenas prácticas
- Un shape estable: mismas claves en cada línea.
- Transformaciones puras cuando encadenas map/filter;
foreachcuando hay reglas de negocio raras. - No uses arrays como “base de datos”: persistir es PDO o ficheros (capítulo 7).
Ejercicio
- Filtra las líneas con
precio >= 20y calcula el total. - Ordena
$pedidoporunidadesdescendente. - Reescribe el
array_map+reducecon un soloforeachy compara legibilidad.
Siguiente paso
Continúa con Formularios y peticiones HTTP.
