实例-sprintf() 函数详解-输出格式转换函数
2018-06-22 05:28:51来源:未知 阅读 ()
Part1:实例
1 $filterfile = basename(PHP_SELF, '.php'); 2 if (isset($_GET['uselastfilter']) && isset($_COOKIE['ECSCP']['lastfilterfile']) && $_COOKIE['ECSCP']['lastfilterfile'] == sprintf('%X', crc32($filterfile))) 3 { 4 return array( 5 'filter' => unserialize(urldecode($_COOKIE['ECSCP']['lastfilter'])), 6 'sql' => base64_decode($_COOKIE['ECSCP']['lastfiltersql']) 7 ); 8 }
上面是get_filter()函数重要的一部分
crc32 — 计算一个字符串的 crc32 多项式
说明
int crc32 ( string $str )
生成 str 的 32 位循环冗余校验码多项式。这通常用于检查传输的数据是否完整。
Warning
由于 PHP 的整数是带符号的,所以在 32 位系统上许多 crc32 校验码将返回负整数。 尽管在 64 位上所有 crc32() 的结果将都是正整数。
因此你需要使用 sprintf() 或 printf() 的"%u"格式符来获取表示无符号 crc32 校验码的字符串。
参数
str
要校验的数据。
返回值
返回 str crc32 校验的整数。
解编码函数详解:php分页
Part2:sprintf详解
sprintf — Return a formatted string
说明
$format
[, mixed $args
[, mixed $...
]] ) Returns a string produced according to the formatting string format
.
用处:把字符串进行多种类型的格式化
用于:处理xml数据格式时,需要用到他来格式化等等
基本语法格式:sprintf("%格式化类型","$str1","$str2") ;先别急我会一个个慢慢说
先看一下类型参照表,也就是要转换成什么类型的格式
这是转换格式的类型参照表
先举个最简单的案例
<?php $str1="1234"; echo sprintf("hello%s","$str1");//效果为: hello1234 ?>
这什么意思呢
要点:
%s = %符号和后面属性符号(s)总称为插入标记组合,也就是把后面准备进行格式化的值($str1)替换在这个位置
hello = 这个单词就是很多人蒙蔽的地方,告诉你这个什么代表也没有,就单纯的代表一个hello,用于分割或者修饰用,一般用[ %s ]、<%s>这样格式化出来后就直接在标签里
记住,一个%标记符后面只有一个类型属性(比如s),s是什么上面有,以字符串的方式格式化
那么多个值怎么格式化一起呢
看
<?php $a="abcdef"; $b="abcdef"; $c="1234"; echo sprintf("%1\$s%2\$s",$c,$a);//效果为: 1234abcdef ?>
%s为一个标记,两个%s%s这样写却是错误的,每个%s必须标记键位,不然我怎么知道都代表格式化后面的哪个$str呢,所以有个特别的语法
%1\$%2\$ 解释:%1表示格式化sprintf("%1\$%2\$",''$str1","$str2")中对应的$str1,那么%2自然表示格式化$str2,\$是代表有多个值准备格式化,所以每个%1和%2或者还有%3的标记后都要加这个符号代表一行中有多个标记,如果只有一个标记就不用\$了占位符了,记住$str2、$str3是可选,也就是可以不格式化这么多
讲个特殊的例子
<?php $a="abcdef"; $b="abcdef"; $c="1234"; echo sprintf("%'x13.2f",$c);// 效果为:xxxxxx1234.00 //echo sprintf("%06.2f", $a); ?>
sprintf("%'x13.2f",$c);
这是什么意思,f是浮点数,第一步按照格式 % '(补位值) 宽度值 格式化类型 这三部分,语法之间必须紧挨着不能用空格
必须解释一下何为补位值:就是设定的宽度超出了,用这个值来填上
解释一下,补位值只有设置宽度超出了目标值才能用
所以就是用x补位,13为总宽度,2为小数点后的宽度,f为格式化类型,别急我会解释
' 号(单引号)代表接下来要用补位类型
为什么他能识别x是补位值呢,因为前面有 ' 号,
为什么他能识别哪几位是哪种类型呢,他是这样识别的,按顺序从先从两头的字符开始识别是什么类型,补位值肯定是单数位,不可能一个位置补两个数吧,所以左边第一位x是补位值,右边第一位是格式化类型,然后中间的自然是宽度值
第二,为什么小数点 后还有一个属性 ,因为这是f(浮点型),必须设置小数点后有几位,不能小数后面不能设置了吧,那浮点数意义何在呢
不要觉得烦,每个例子都是浓缩出来的
整数补位
<?php $a="abcdef"; $b="abcdef"; $c="1234"; echo sprintf("%'07s",$c); //结果是:0001234 ?>
这就是整数补位,还是一样
第一步按照格式 % '(补位值) 宽度值 格式化类型 这三部分
0是补位值 7是宽度值 s自然是格式化类型
还有一种最重要的例子
<?php $a="abcdef"; $b="abcdef"; $c="1234"; echo sprintf("[%-6s]",$c); //结果是:[1234 ] echo sprintf("[%-4s]",$c); //结果是:[1234] echo sprintf("[%4.2s]",$c); //结果是:[ 12] ?>
这个第一步 [ ] 仅仅只是修饰,不用理解
第二步,没有 ' 号,证明没有补位,无需添加补位值
所以语法格式为 : % 宽度值 格式化类型 这两部分
第一二行解释如下:
第一个宽度为6,但是$c=1234 ,只有4个字符,所以宽度不够,所以右边自动扩充(扩充再多也只显示一个空格位置),为什么在右边扩充,因为宽度前有个 - 号,代表补位方向相反,如在补位值前加-,自然从右边开始补位
下面为什么没变化,因为宽度正好一致,只是补位的方向改变了
第三行解释如下:
不要被蒙蔽了,语法结构还是一样 % 宽度值 格式化类型 这两部分
没有 ' 号,证明没有补位,无需添加补位值
所以4.2依旧是宽度值
只是小数点左边的4代表总宽度,右边的2代表只显示2位出来,所以又空缺了两个,所以左边开始扩充两个空位,为什么只显示一个空格上一段说了,再说一次吧扩充再多也只显示一个空格位置。默认从左边开始
Part3:输出格式转换函数
printf 、 vprintf 、 sprintf 、vsprintf 、fprintf 、vfprintf 的各自的区别
1)printf - 输出格式化字符串
int printf ( string $format
[, mixed $args
[, mixed $...
]] )
依据 format
格式参数产生输出。
参数
format
-
format
描述信息,请参见 sprintf()。 args
...
-
返回值
返回输出字符串的长度。
2)vprintf — 输出格式化字符串
$format
, array $args
) 根据 format
(sprintf() 函数文档中有相关描述)参数指定的格式,在一个格式化字符串中显示多个值。
作用与 printf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。
参数
format
-
关于
format
的描述,参见 sprintf()。 args
返回值
返回输出字符串的长度。
3)sprintf - Return a formatted string 格式化函数中用到最多的
string sprintf ( string $format
[, mixed $args
[, mixed $...
]] )
见Part2
1 //Example #7 printf(): various examples 2 3 <?php 4 $n = 43951789; 5 $u = -43951789; 6 $c = 65; // ASCII 65 is 'A' 7 8 // notice the double %%, this prints a literal '%' character 9 printf("%%b = '%b'\n", $n); // binary representation 10 printf("%%c = '%c'\n", $c); // print the ascii character, same as chr() function 11 printf("%%d = '%d'\n", $n); // standard integer representation 12 printf("%%e = '%e'\n", $n); // scientific notation 13 printf("%%u = '%u'\n", $n); // unsigned integer representation of a positive integer 14 printf("%%u = '%u'\n", $u); // unsigned integer representation of a negative integer 15 printf("%%f = '%f'\n", $n); // floating point representation 16 printf("%%o = '%o'\n", $n); // octal representation 17 printf("%%s = '%s'\n", $n); // string representation 18 printf("%%x = '%x'\n", $n); // hexadecimal representation (lower-case) 19 printf("%%X = '%X'\n", $n); // hexadecimal representation (upper-case) 20 21 printf("%%+d = '%+d'\n", $n); // sign specifier on a positive integer 22 printf("%%+d = '%+d'\n", $u); // sign specifier on a negative integer 23 ?> 24 25 26 /**以上例程会输出: 27 28 29 %b = '10100111101010011010101101' 30 %c = 'A' 31 %d = '43951789' 32 %e = '4.39518e+7' 33 %u = '43951789' 34 %u = '4251015507' 35 %f = '43951789.000000' 36 %o = '247523255' 37 %s = '43951789' 38 %x = '29ea6ad' 39 %X = '29EA6AD' 40 %+d = '+43951789' 41 %+d = '-43951789' 42 **/ 43 44 45 //Example #8 printf(): string specifiers 46 47 <?php 48 $s = 'monkey'; 49 $t = 'many monkeys'; 50 51 printf("[%s]\n", $s); // standard string output 52 printf("[%10s]\n", $s); // right-justification with spaces 53 printf("[%-10s]\n", $s); // left-justification with spaces 54 printf("[%010s]\n", $s); // zero-padding works on strings too 55 printf("[%'#10s]\n", $s); // use the custom padding character '#' 56 printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters 57 ?> 58 59 /*以上例程会输出: 60 [monkey] 61 [ monkey] 62 [monkey ] 63 [0000monkey] 64 [####monkey] 65 [many monke] 66 */ 67 68 //Example #9 sprintf(): zero-padded integers 69 70 <?php 71 $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day); 72 ?> 73 74 //Example #10 sprintf(): formatting currency 75 76 <?php 77 $money1 = 68.75; 78 $money2 = 54.35; 79 $money = $money1 + $money2; 80 // echo $money will output "123.1"; 81 $formatted = sprintf("%01.2f", $money); 82 // echo $formatted will output "123.10" 83 ?> 84 85 86 //Example #11 sprintf(): scientific notation 87 88 <?php 89 $number = 362525200; 90 91 echo sprintf("%.3e", $number); // outputs 3.625e+8 92 ?>
4)vsprintf — 返回格式化字符串
$format
, array $args
)作用与 sprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。
参数
format
-
关于
format
的描述,参见 sprintf()。 args
返回值
根据 format
(sprintf() 函数文档中有相关描述)参数指定的格式,在一个字符串中返回一系列值。
1 <?php 2 print vsprintf("%04d-%02d-%02d", explode('-', '1988-8-1')); // 1988-08-01 3 ?>
5)fprintf — 将格式化后的字符串写入到流
$handle
, string $format
[, mixed $args
[, mixed $...
]] ) 写入一个根据 format
格式化后的字符串到 由 handle
句柄打开的流中。
参数
handle
-
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
format
-
参见 sprintf() 中对
format
的描述。 args
...
返回值
返回写入的字符串长度。
1 //formatting currency 2 <?php 3 if (!($fp = fopen('currency.txt', 'w'))) { 4 return; 5 } 6 7 $money1 = 68.75; 8 $money2 = 54.35; 9 $money = $money1 + $money2; 10 // echo $money will output "123.1"; 11 $len = fprintf($fp, '%01.2f', $money); 12 // will write "123.10" to currency.txt 13 14 echo "wrote $len bytes to currency.txt"; 15 // use the return value of fprintf to determine how many bytes we wrote 16 ?>
6)vfprintf — 将格式化字符串写入流
$handle
, string $format
, array $args
) 向由 handle
指定的流资源句柄中写入根据 format
格式化后的字符串。
作用与 fprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。
参数
handle
format
-
关于
format
的描述,参见 sprintf()。 args
返回值
返回输出字符串的长度。
1 <?php 2 if (!($fp = fopen('date.txt', 'w'))) 3 return; 4 5 vfprintf($fp, "%04d-%02d-%02d", array($year, $month, $day)); 6 // 将向 date.txt 写入格式化的 ISO 标准日期 7 ?>
Part4:面试题
网上找的的一个面试题
说出echo、print、print_r、printf、sprintf之间的区别
1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。
2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。
3:print_r:是函数,可以打印复合类型,例如:stirng、int、float、array、object等,输出array时会用结构表示,而且可以通过print_r($str,true)来使print_r不输出而返回print_r处理后的值
4:printf:是函数,把文字格式化以后输出
5:sprintf:是函数,跟printf相似,但不打印,而是返回格式化后的文字(该函数把格式化的字符串写写入一个变量中,而不是输出来),其他的与printf一样。
例如:
1 $str = "Hello";
2 $number = 123;
3 $txt = sprintf("%s world. Day number %u",$str,$number);
4 //输出: Hello world. Day number 123
6:var_dump():函数,输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。
可以通过function_exists('函数名称')进行测试
1 var_dump(function_exists('print')); //bool(false) 2 var_dump(function_exists('echo')); //bool(false) 3 var_dump(function_exists('print_r')); //bool(true)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:php全局变量 超全局变量
下一篇:php基础语句 变量 符号
- PHP实现的MD5结合RSA签名算法实例 2020-03-22
- PHP多进程之pcntl_fork的实例详解 2020-03-22
- PHP基于自定义函数实现的汉字转拼音功能实例 2020-03-17
- PHP empty函数报错解决办法 2020-03-04
- PHP调用JAVA的WebService简单实例 2020-03-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash