array_chunk y array_slice en PHP: dividir y paginar arrays

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP