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
用處:把字符串進行多種類型的格式化
用於:處理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
格式參數產生輸出。
返回輸出字符串的長度。
2)vprintf — 輸出格式化字符串
$format
, array $args
)
根據 format
(sprintf() 函數文檔中有相關描述)參數指定的格式,在一個格式化字符串中顯示多個值。
作用與 printf() 函數類似,但是接收一個數組參數,而不是一系列可變數量的參數。
返回值
返回輸出字符串的長度。
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 — 將格式化后的字符串寫入到流
寫入一個根據 format
格式化后的字符串到 由 handle
句柄打開的流中。
返回值
返回寫入的字符串長度。

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)