str_pad y str_repeat en PHP: rellenar y repetir cadenas

str_pad() extiende una cadena hasta una longitud determinada rellenando con otro carácter. str_repeat() repite una cadena un número fijo de veces. Parecen funciones menores, pero aparecen más de lo que imaginas: pedidos con referencia de longitud fija, columnas alineadas en texto plano, separadores visuales en scripts de consola y barras de progreso.

Sintaxis

<?php
str_pad(
    string $input,
    int    $length,
    string $pad_string = ' ',
    int    $pad_type   = STR_PAD_RIGHT
): string

str_repeat(string $string, int $times): string
?>

El tercer argumento de str_pad() es el carácter de relleno (espacio por defecto). El cuarto define hacia dónde se aplica el relleno: STR_PAD_RIGHT (por defecto), STR_PAD_LEFT o STR_PAD_BOTH.

Padding con ceros para pedidos y SKUs

<?php
$ids = [1, 42, 387, 9001, 100000];

foreach ($ids as $id) {
    // Referencia de 8 dígitos con ceros a la izquierda
    $ref = 'PED-' . str_pad($id, 8, '0', STR_PAD_LEFT);
    echo $ref . "n";
}
// PED-00000001
// PED-00000042
// PED-00000387
// PED-00009001
// PED-00100000
?>

La alternativa con sprintf('%08d', $id) produce el mismo resultado y puede ser más legible si ya estás usando sprintf() para el resto del formato. Elige la que encaje mejor con el estilo del proyecto.

Alinear columnas en texto plano

<?php
$productos = [
    ['Camiseta básica',   19.90],
    ['Pantalón chino',    39.90],
    ['Zapatillas running', 89.90],
];

$cabecera = str_pad('PRODUCTO', 25) . str_pad('PRECIO', 10, ' ', STR_PAD_LEFT);
echo $cabecera . "n";
echo str_repeat('-', 35) . "n";

foreach ($productos as [$nombre, $precio]) {
    $linea = str_pad($nombre, 25) . str_pad(number_format($precio, 2, ',', '.') . ' €', 10, ' ', STR_PAD_LEFT);
    echo $linea . "n";
}
// PRODUCTO                   PRECIO
// -----------------------------------
// Camiseta básica            19,90 €
// Pantalón chino             39,90 €
// Zapatillas running         89,90 €
?>

STR_PAD_BOTH para cabeceras centradas

<?php
function cabecera(string $titulo, int $ancho = 40): string
{
    $centrado = str_pad($titulo, $ancho, ' ', STR_PAD_BOTH);
    return str_repeat('=', $ancho) . "n" . $centrado . "n" . str_repeat('=', $ancho);
}

echo cabecera('INFORME DE VENTAS JUNIO 2024');
// ========================================
//        INFORME DE VENTAS JUNIO 2024
// ========================================
?>

Barras de progreso en CLI

<?php
function progreso(int $actual, int $total, int $ancho = 30): string
{
    $porcentaje = $total > 0 ? (int) ($actual * $ancho / $total) : 0;
    $barra      = str_repeat('#', $porcentaje);
    $vacio      = str_repeat('-', $ancho - $porcentaje);
    $pct        = str_pad((int) ($actual * 100 / $total) . '%', 4, ' ', STR_PAD_LEFT);
    return "[{$barra}{$vacio}] {$pct}";
}

for ($i = 0; $i <= 10; $i++) {
    echo "r" . progreso($i, 10);
    usleep(200000);
}
echo "n";
?>

Avisos sobre UTF-8 y mb_str_pad

str_pad() trabaja con bytes, no con caracteres. Si el texto de relleno o la cadena original contienen caracteres multibyte (acentos, emojis, caracteres asiáticos), la longitud calculada en caracteres no coincidirá con los bytes usados internamente. PHP 8.3 introdujo mb_str_pad() que trabaja correctamente con multibyte; si usas versiones anteriores y necesitas padding con caracteres UTF-8, tendrás que construirte una función auxiliar.

La documentación oficial de str_pad() y la de str_repeat() incluyen el historial de versiones y los parámetros detallados.

COMPARTE ESTE ARTÍCULO

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