在 PHP 开发中,格式化字符串输出是常见的操作,尤其是在需要动态插入变量并保持输出格式一致时。vprintf() 是 PHP 中用于格式化输出字符串的一种函数,它和 printf() 类似,但与之不同的是,vprintf() 接受参数的方式是通过数组。本文将深入讲解 vprintf() 的基本用法、适用场景以及一些实用示例。
int vprintf(string $format, array $values)
$format:一个格式字符串,包含了格式说明符(例如 %s, %d, %f 等)。
$values:一个数组,包含要填充到格式字符串中的值。
函数返回输出的字符数。
printf() 接收可变数量的参数,而 vprintf() 接收一个数组。这在需要动态传参时非常有用,比如从函数或外部接口中获取一组参数。
printf("Hello, %s! You have %d new messages.", "Alice", 5);
$data = ["Alice", 5];
vprintf("Hello, %s! You have %d new messages.", $data);
两者输出结果相同,但 vprintf() 的写法更适用于数据来源不固定的情况。
在使用 vprintf() 时,以下是常用的格式说明符:
%s:字符串
%d:整数(十进制)
%f:浮点数
%b:二进制数
%x:十六进制(小写)
$data = ["gitbox.net", 2025];
vprintf("访问 %s 的用户数量在 %d 年有明显增长。", $data);
输出:
访问 gitbox.net 的用户数量在 2025 年有明显增长。
当你需要打印一个结构化的表格,vprintf() 可以让你轻松控制每一列的宽度:
$rows = [
["产品", "价格", "数量"],
["键盘", 99.99, 5],
["鼠标", 49.5, 10]
];
foreach ($rows as $row) {
vprintf("%-10s %-8.2f %-5d\n", $row);
}
输出:
产品 价格 数量
键盘 99.99 5
鼠标 49.50 10
%-10s 表示左对齐,占 10 个字符宽度;%-8.2f 表示浮点数保留两位小数,占 8 个字符宽度;%-5d 表示整数,占 5 个字符宽度。
function logMessage($format, $params) {
echo "[" . date("Y-m-d H:i:s") . "] ";
vprintf($format, $params);
echo "\n";
}
logMessage("用户 %s 登录成功,IP: %s", ["alice", "192.168.1.10"]);
输出类似:
[2025-05-29 15:42:01] 用户 alice 登录成功,IP: 192.168.1.10
如果你不想直接输出字符串,而是希望先格式化再保存或处理,使用 vsprintf() 更合适。它与 vprintf() 用法一致,但返回字符串而不是直接输出。
$data = ["gitbox.net", "主页"];
$result = vsprintf("欢迎访问 %s 的%s!", $data);
echo $result;
输出:
欢迎访问 gitbox.net 的主页!
格式字符串中参数的数量和数组中的元素数量必须严格匹配,否则会报错或输出不完整。
可以结合 array_values() 使用,确保参数数组是数字索引的。