array_chunk() divide un array en trozos de tamaño fijo, y array_slice() extrae una porción definida por posición y longitud. Juntas cubren los dos patrones más habituales de trabajo con subconjuntos de datos: el procesamiento por lotes (enviar emails en grupos de 50, importar registros de 100 en 100) y la paginación (mostrar 10 resultados por página).
array_chunk(): dividir en lotes de igual tamaño
<?php array_chunk(array $array, int $length, bool $preserve_keys = false): array ?>
<?php
$ids = range(1, 250); // 250 IDs de suscriptores
// Dividir en grupos de 50 para envío por lotes
$lotes = array_chunk($ids, 50);
foreach ($lotes as $numLote => $lote) {
echo sprintf("Lote %d: IDs del %d al %d (%d emails)n",
$numLote + 1,
$lote[0],
end($lote),
count($lote)
);
// enviarEmailsMasivos($lote);
}
// Lote 1: IDs del 1 al 50 (50 emails)
// Lote 2: IDs del 51 al 100 (50 emails)
// ...
// Lote 5: IDs del 201 al 250 (50 emails)
?>
array_slice(): extraer una porción por posición
<?php
array_slice(
array $array,
int $offset,
?int $length = null,
bool $preserve_keys = false
): array
?>
<?php $articulos = ['PHP', 'Python', 'JavaScript', 'Rust', 'Go', 'Kotlin', 'Swift']; // Los tres primeros $primerosTres = array_slice($articulos, 0, 3); // ['PHP', 'Python', 'JavaScript'] // A partir del cuarto $desdeElCuarto = array_slice($articulos, 3); // ['Rust', 'Go', 'Kotlin', 'Swift'] // Los dos últimos (offset negativo) $ultimosDos = array_slice($articulos, -2); // ['Kotlin', 'Swift'] ?>
Paginador completo con array_slice
<?php
function paginar(array $datos, int $pagina, int $porPagina = 10): array
{
$total = count($datos);
$paginas = (int) ceil($total / $porPagina);
$pagina = max(1, min($pagina, $paginas)); // limitar entre 1 y $paginas
$offset = ($pagina - 1) * $porPagina;
return [
'datos' => array_slice($datos, $offset, $porPagina),
'total' => $total,
'pagina' => $pagina,
'paginas' => $paginas,
'por_pagina' => $porPagina,
];
}
$todos = range(1, 47); // 47 artículos
$resultado = paginar($todos, pagina: 3, porPagina: 10);
echo "Página {$resultado['pagina']} de {$resultado['paginas']}n";
echo "Mostrando " . count($resultado['datos']) . " de {$resultado['total']}n";
echo "IDs: " . implode(', ', $resultado['datos']) . "n";
// Página 3 de 5
// Mostrando 10 de 47
// IDs: 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
?>
Gestionar colas con array_splice
array_splice() extrae y elimina una porción del array original al mismo tiempo, y puede insertar nuevos elementos en su lugar. Es la herramienta para implementar colas y listas de tareas:
<?php
$cola = ['tarea-1', 'tarea-2', 'tarea-3', 'tarea-4', 'tarea-5'];
// Sacar las 2 primeras tareas para procesarlas
$lote = array_splice($cola, 0, 2);
echo "Procesando: " . implode(', ', $lote) . "n";
// Procesando: tarea-1, tarea-2
echo "Cola restante: " . implode(', ', $cola) . "n";
// Cola restante: tarea-3, tarea-4, tarea-5
// Insertar una nueva tarea urgente al inicio
array_splice($cola, 0, 0, ['tarea-urgente']);
echo "Cola actualizada: " . implode(', ', $cola) . "n";
// Cola actualizada: tarea-urgente, tarea-3, tarea-4, tarea-5
?>
Errores frecuentes
El error más habitual con array_slice() es confundir $offset con el número de página directamente. El offset es la posición del primer elemento, no el número de página. Para la página 3 con 10 elementos por página el offset es (3-1)*10 = 20, no 3.
La documentación oficial de array_chunk() y la de array_slice() detallan el comportamiento del parámetro preserve_keys y los offsets negativos.
