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.
