如果传递的是对象而不是数组,PHP 会自动将对象转换为数组,以便可以直接在 vprintf 中使用它。
<?php
$object = new stdClass();
$object->Property1 = 'Value 1';
$object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);
/* 输出结果为:
Value 1 Value 2
*/
?>
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
vprintf — 输出格式化字符串
format
格式字符串由零个或多个指令组成:直接复制到结果中的普通字符(不包括%
)和转换说明符,每个转换说明符都会获取其自己的参数。
转换说明符遵循此原型:%[argnum$][flags][width][.precision]specifier
。
后跟美元符号$
的整数,用于指定转换中要处理的哪个编号参数。
标志 | 描述 |
---|---|
- |
在给定的字段宽度内左对齐;右对齐为默认值 |
+ |
在正数前加上加号+ ;默认情况下,只有负数前缀为负号。 |
(空格) |
用空格填充结果。这是默认值。 |
0 |
仅用零左填充数字。对于s 说明符,这也可以用零右填充。 |
' (字符) |
用字符 (char) 填充结果。 |
一个整数,表示此转换应产生的字符数(最小值),或*
。如果使用*
,则宽度作为额外的整数值提供,该值位于说明符格式化的值之前。
一个句点.
,后跟一个整数或*
(可选),其含义取决于说明符
e
、E
、f
和F
说明符:这是小数点后要打印的位数(默认为 6)。
g
、G
、h
和H
说明符:这是要打印的有效数字的最大数量。
s
说明符:它充当截止点,为字符串设置最大字符限制。
注意:如果指定了句点但不提供精度的显式值,则假定为 0。如果使用
*
,则精度作为额外的整数值提供,该值位于说明符格式化的值之前。
说明符 | 描述 |
---|---|
% |
文字百分号字符。不需要参数。 |
b |
参数被视为整数并显示为二进制数。 |
c |
参数被视为整数并显示为具有该 ASCII 值的字符。 |
d |
参数被视为整数并显示为(带符号的)十进制数。 |
e |
参数被视为科学计数法(例如 1.2e+2)。 |
E |
与e 说明符类似,但使用大写字母(例如 1.2E+2)。 |
f |
参数被视为浮点数并显示为浮点数(区域感知)。 |
F |
参数被视为浮点数并显示为浮点数(非区域感知)。 |
g |
通用格式。 设 P 等于精度(如果非零),如果省略精度则为 6,如果精度为零则为 1。然后,如果使用 E 样式的转换具有 X 指数 如果 P > X ≥ −4,则转换使用 f 样式和精度 P − (X + 1)。否则,转换使用 e 样式和精度 P − 1。 |
G |
与g 说明符类似,但使用E 和f 。 |
h |
与g 说明符类似,但使用F 。从 PHP 8.0.0 开始可用。 |
H |
与g 说明符类似,但使用E 和F 。从 PHP 8.0.0 开始可用。 |
o |
参数被视为整数并显示为八进制数。 |
s |
参数被视为字符串并显示为字符串。 |
u |
参数被视为整数并显示为无符号十进制数。 |
x |
参数被视为整数并显示为十六进制数(使用小写字母)。 |
X |
参数被视为整数并显示为十六进制数(使用大写字母)。 |
c
类型说明符忽略填充和宽度。
尝试将字符串和宽度说明符组合与每个字符需要多个字节的字符集一起使用可能会导致意外结果。
变量将被强制转换为适合说明符的类型
类型 | 说明符 |
---|---|
字符串 | s |
整数 |
d 、u 、c 、o 、x 、X 、b |
浮点数 |
e 、E 、f 、F 、g 、G 、h 、H |
values
返回输出字符串的长度。
从 PHP 8.0.0 开始,如果参数数量为零,则会抛出ValueError。在 PHP 8.0.0 之前,会发出E_WARNING
。
从 PHP 8.0.0 开始,如果[width]
小于零或大于PHP_INT_MAX
,则会抛出ValueError。在 PHP 8.0.0 之前,会发出E_WARNING
。
从 PHP 8.0.0 开始,如果[precision]
小于零或大于PHP_INT_MAX
,则会抛出ValueError。在 PHP 8.0.0 之前,会发出E_WARNING
。
从 PHP 8.0.0 开始,如果提供的参数少于所需参数,则会抛出ValueError。在 PHP 8.0.0 之前,会返回false
并发出E_WARNING
。
版本 | 描述 |
---|---|
8.0.0 | 此函数不再在失败时返回false 。 |
8.0.0 | 如果参数数量为零,则抛出ValueError;以前此函数会发出E_WARNING 。 |
8.0.0 | 如果[width] 小于零或大于PHP_INT_MAX ,则抛出ValueError;以前此函数会发出E_WARNING 。 |
8.0.0 | 如果[precision] 小于零或大于PHP_INT_MAX ,则抛出ValueError;以前此函数会发出E_WARNING 。 |
8.0.0 | 如果提供的参数少于所需参数,则抛出ValueError;以前此函数会发出E_WARNING 。 |
示例 #1 vprintf():零填充整数
<?php
vprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>
以上示例将输出
1988-08-01
如果传递的是对象而不是数组,PHP 会自动将对象转换为数组,以便可以直接在 vprintf 中使用它。
<?php
$object = new stdClass();
$object->Property1 = 'Value 1';
$object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);
/* 输出结果为:
Value 1 Value 2
*/
?>
使用 ... 运算符,vprintf($format, $array) 基本上就等同于 printf($format, ...$array)。
<?php
$string = 'The site runs on PHP '.phpversion();
preg_match('/php ((\d)\.\d\.\d+)/i',$string,$matches);
print_r($matches);
vprintf('Match: %s<br /> Version %s; Major:%d.',$matches);
?>
输出
Array ( [0] => PHP 5.2.5 [1] => 5.2.5 [2] => 5 )
Match: PHP 5.2.5 Version 5.2.5; Major:5.
对于 preg_match
如果提供了 matches,则它将填充搜索结果。$matches[0] 将包含与完整模式匹配的文本,$matches[1] 将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。
致 toolofthesystem at gmail dot com
您不需要在 vprintf() 中使用输出缓冲,因为您可以使用 vsprintf(),它具有与 vprintf() 相同的功能,只是它返回结果字符串而不是输出它。
我知道您可以使用 %1$s 或 %3$s 来选择第一个或第三个字符串,但是您能否或如何使用数组名称来选择它?
例如 %'user'$s $'email'$s
我倾向于随着时间的推移向我的数据库添加内容,这可以节省大量的重新编码工作。
另一种显示数组的方法是使用 array_walk()。这在内联 echo/print 中可能很有用,而 foreach 在那里不起作用,例如:
<?php
echo "These errors: ", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "must be corrected.";
?>
根据我的测试,对于文本块,sprintf() 速度很慢。
此外,占位符和实际变量或数据结构列表之间的映射通常使这段代码难以阅读。但是 printf() 系列得到了广泛的支持,并具有许多不错的功能。但是性能却是一个冰冷的情妇!
从易于阅读和维护、调试的角度来看,我更喜欢 HEREDOC 和 "...{$variable}..." 方法。
对于带有占位符的 HTML 标记块,到目前为止最快的是:
?>
<div> 标记等<?= $variable ?>更多标记
<?
我的测试包括使用输出缓冲进行 100 万次迭代循环的 20 次运行,每次循环都丢弃缓冲区。
时间范围从 <?= $var ?> 方法的平均 2.1 毫秒/百万次重复到使用 printf() 的 7.6 毫秒/百万次。
我也会尝试一些基准测试工具,因为我刚刚自己编写了这个工具,它可能会引入偏差,但它们已经在负载较低的开发服务器上运行。
希望有趣。
尝试列出从 MySQL 返回的信息时,此函数有时很有用
function print_sql($query,$printf){
$sql_sql = mysql_query($query);
while($sql = mysql_fetch_row($sql_sql)){
vprintf($printf,$sql);
}
}
不幸的是,当我尝试创建一个参数以允许将其包含在返回的字符串中时,这似乎会绕过输出缓冲……要么就是我没有正确操作。