PHP vfprintf() 函数
说明
vfprintf()
函数将格式化字符串写入流,通常是文件。
此函数接受一个特殊的格式字符串,然后是任意数量的其他参数,这些参数将被格式化并拼接到格式字符串中的指定位置以生成结果。
相关函数: fprintf()
, printf()
, sprintf()
, vprintf()
and vsprintf()
.
下表总结了该函数的技术细节。
返回值: | 返回写入字符串的长度。 |
---|---|
版本: | PHP 5+ |
语法
vfprintf()
函数的基本语法如下:
下面的例子展示了 vfprintf()
函数的作用。
<?php
$file = "data.txt";
// 打开文件进行写入
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
// 样本数组
$argarray = array("50", "United States");
// 定义格式字符串
$format = "There are %d states in the %s.";
// 格式化字符串并将其写入文件
$length = vfprintf($handle, $format, $argarray);
echo "Wrote $length bytes to data.txt";
?>
上面示例的输出将如下所示:
并且,写入文件"data.txt"的文本将是:
在上面的例子中,如果"data.txt"文件不存在,PHP 会自动创建它并写入数据。 但是,如果"data.txt"文件已经存在,PHP 将在写入新数据之前擦除该文件的内容(如果有的话)。 请参阅 PHP 文件系统 上的教程以了解更多信息。
注意: format 字符串中的每个字符都将按字面意思书写,除了 % 字符和紧随其后的字符。 % 字符表示 转换规范 的开头,它指定如何打印 format 字符串后面的参数。
提示: vfprintf()
函数与 fprintf()
相同,但有一个例外。 vfprintf()
函数接受参数数组,而 fprintf()
接受参数列表。
参数
vfprintf()
函数接受以下参数。
参数 | 说明 |
---|---|
stream | 必填。 指定通常使用 fopen() 创建的文件系统指针资源。 |
format | 必填。 指定格式字符串。 由普通字符(不包括%)和一个或多个转换规范组成。 |
argument_array | 必填。 指定要格式化并插入到 format 字符串中转换规范位置的参数数组。 |
转换规范语法
本节详细介绍格式字符串中转换规范的语法。
转换规范以百分号 (%) 开头。 您必须在 format 字符串之后包含传递给 vfprintf()
函数的每个参数的转换规范。
或者,您可以使用后跟美元符号的参数编号(即 argnum$
)将 format 字符串中的多个转换规范应用于同一参数。 它必须紧跟在百分号 (%) 之后,在任何其他说明符之前。 请参阅更多示例部分。
转换规范通常具有以下语法:
%[argnum$][flags][width][.precision]specifier
argnum
一个整数,后跟一个美元符号 $,用于指定在转换中处理哪个数字参数。
flags
标志由以下一个或多个字符组成:
标志 | 说明 |
---|---|
+ |
在正数之前添加一个加号。 默认情况下,只标记负数。 |
- |
在给定的字段宽度内左对齐; 右对齐是默认设置。 |
(space) |
用空格填充结果。 这是默认设置。 |
0 |
只用零填充数字。 使用 s 说明符,这也可以右填充零。 |
'(char) |
用字符 (char) 填充结果。 必须与宽度说明符一起使用。 |
width
一个整数,指示此转换应产生多少个字符(最少)。
precision
句点 (.) 后跟一个整数,其含义取决于说明符:
- 对于 e、E、f 和 F 说明符:这是要在小数点后打印的位数(默认为 6)。
- 对于 g 和 G 说明符:这是要打印的有效数字的最大数量。
- 对于 s 说明符:它充当截止点,为字符串设置最大字符限制。
如果指定的周期没有明确的精度值,则假定为 0。
specifier
单个字符,指示应如何解释参数的类型。
specifier | 说明 |
---|---|
% |
文字百分比字符。 不需要参数。 |
b |
参数被视为整数并打印为二进制数。 |
c |
参数被视为整数并打印为具有该 ASCII 的字符。 |
d |
参数被视为整数并打印为(有符号的)十进制数。 |
e |
参数被视为科学记数法(例如 1.2e+2)。 精度说明符代表小数点后的位数。 |
E |
类似于 e 说明符,但使用大写字母(例如 1.2E+2)。 |
f |
参数被视为浮点数并打印为浮点数(区域设置感知)。 |
F |
参数被视为浮点数并打印为浮点数(非语言环境感知)。 |
g |
一般格式。 使用 e 和 f。 |
G |
类似于 g 说明符,但使用 E 和 f。 |
o |
参数被视为整数并打印为八进制数。 |
s |
参数被当作字符串处理和打印。 |
u |
参数被视为整数并打印为无符号十进制数。 |
x |
参数被视为整数并打印为十六进制数字(小写字母)。 |
X |
参数被视为整数并打印为十六进制数字(大写字母)。 |
更多示例
这里有更多示例展示了 vfprintf()
函数的实际工作原理:
以下示例显示如何将多个转换规范应用于同一参数。
<?php
$file = "data.txt";
// 打开文件进行写入
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
// 样本数组
$array = array('star');
// 定义格式字符串
$format = 'The polar %1$s is the brightest %1$s in the sky.';
// 格式化字符串并将其写入文件
$length = vfprintf($handle, $format, $array);
echo "Wrote $length bytes to data.txt";
?>
上面示例的输出将如下所示:
并且,写入文件"data.txt"的文本将是:
提示: 如果格式字符串用双引号 ("") 括起来,则需要将 argnum 后面的美元符号用反斜杠字符 (\) 转义,如下所示 %1\$s
,以便 PHP 不会尝试将它们解释为变量。 使用这样的反斜杠称为转义序列。
以下示例显示了如何格式化带小数点和不带小数点的相同数字。
<?php
$file = "data.txt";
// 打开文件进行写入
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
// 样本数组
$array = array(499);
// 定义格式字符串
$format = "The number without decimal points: %1\$d, and the number with two decimal points: %1\$.2f";
// 格式化字符串并将其写入文件
$length = vfprintf($handle, $format, $array);
echo "Wrote $length bytes to data.txt";
?>
上面示例的输出将如下所示:
并且,写入文件"data.txt"的文本将是:
默认情况下,每个转换规范将按照它们在函数中列出的顺序替换为格式化参数。 但是,您可以使用 argnum 在格式字符串中交换参数。
<?php
$file = "data.txt";
// 打开文件进行写入
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
// 样本数组
$array = array("50", "United States");
// 定义格式字符串
$format = "The %2\$s is a federal republic of %1\$d states.";
// 格式化字符串并将其写入文件
$length = vfprintf($handle, $format, $array);
echo "Wrote $length bytes to data.txt";
?>
上面示例的输出将如下所示:
并且,写入文件"data.txt"的文本将是:
提示:如果格式字符串中占位符或转换规范的顺序与函数内列出的参数的顺序不匹配。 您可以使用 argnum 轻松指示占位符引用哪些参数,并使函数代码保持原样。
以下示例仅演示了使用 printf()
函数对整数值使用不同格式说明符时可能产生的结果。
<?php
// 样本整数
$num1 = 123456789;
$num2 = -123456789;
$num3 = 65; // ASCII 65 is 'A'
// 注意双 %%,这只是打印一个 '%' 字符
printf("%%b = %b <br>", $num1); // Binary representation
printf("%%c = %c <br>", $num3); // The ASCII Character
printf("%%d = %d <br>", $num1); // Standard integer representation
printf("%%d = %d <br>", $num2); // Standard integer representation
printf("%%e = %e <br>", $num1); // Scientific notation (lowercase)
printf("%%E = %E <br>", $num1); // Scientific notation (uppercase)
printf("%%u = %u <br>", $num1); // Unsigned integer representation (positive)
printf("%%u = %u <br>", $num2); // Unsigned integer representation (negative)
printf("%%f = %f <br>", $num1); // Floating-point representation (locale aware)
printf("%%F = %F <br>", $num1); // Floating-point representation (non-locale aware)
printf("%%g = %g <br>", $num1); // Shorter of %e and %f
printf("%%G = %G <br>", $num1); // Shorter of %E and %f
printf("%%o = %o <br>", $num1); // Octal representation
printf("%%s = %s <br>", $num1); // String representation
printf("%%x = %x <br>", $num1); // Hexadecimal representation (lowercase)
printf("%%X = %X <br>", $num1); // Hexadecimal representation (uppercase)
printf("%%+d = %+d <br>", $num1); // Sign specifier (positive)
printf("%%+d = %+d <br>", $num2); // Sign specifier (negative)
?>
同样,以下示例显示了如何使用 s 说明符以各种方式格式化字符串。
<?php
$str1 = "Hello";
$str2 = "Hello Alexander!";
printf("[%s]<br>", $str1); // Standard string output
printf("[%10s]<br>", $str1); // Right-justifies the string with spaces
printf("[%-10s]<br>", $str1); // Left-justifies the string value with spaces
printf("[%010s]<br>", $str1); // Left-pads string with zeros.
printf("[%-010s]<br>", $str1); // Right-pads string with zeros
printf("[%'#10s]<br>", $str1); // Left-pads string with '#' character
printf("[%.10s]<br>", $str2); // Cuts off string after 10 characters
?>