實例-sprintf() 函數詳解-輸出格式轉換函數


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

說明

  string sprintf ( 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輸出格式化字符串

    int vprintf ( string $format , array $args )

    根據 formatsprintf() 函數文檔中有相關描述)參數指定的格式,在一個格式化字符串中顯示多個值。

    作用與 printf() 函數類似,但是接收一個數組參數,而不是一系列可變數量的參數。

     參數

       format

  關於 format 的描述,參見 sprintf()

     args

   返回值

    返回輸出字符串的長度。

  3)sprintfReturn 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 ?> 
View Code

 

  4)vsprintf返回格式化字符串

    string vsprintf ( string $format , array $args )

    作用與 sprintf() 函數類似,但是接收一個數組參數,而不是一系列可變數量的參數。

   參數

    format

 關於 format 的描述,參見 sprintf()

    args

   返回值

    根據 formatsprintf() 函數文檔中有相關描述)參數指定的格式,在一個字符串中返回一系列值。 

1 <?php
2 print vsprintf("%04d-%02d-%02d", explode('-', '1988-8-1')); // 1988-08-01
3 ?> 
View Code

 

  5)fprintf將格式化后的字符串寫入到流

    int fprintf ( resource $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 ?> 
View Code

  6)vfprintf將格式化字符串寫入流

    int vfprintf ( resource $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 ?> 
View Code

 

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)
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM