如果傳遞的是物件而不是陣列,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) |
使用字元 (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 等於精確度,如果省略精確度,則令 P 等於 6,如果精確度為零,則令 P 等於 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 |
值
傳回輸出字串的長度。
自 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 = '網站運行在 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()。這在無法使用 foreach 的內聯 echo/print 中非常有用,例如:
<?php
echo "這些錯誤:", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "必須修正。";
?>
根據我的測試,對於文字區塊,sprintf() 很慢。
此外,佔位符和實際變數或資料結構列表之間的對應關係通常會使程式碼難以閱讀。但是 printf() 系列受到廣泛支援,並且具有大量不錯的功能。但是,效能是很嚴苛的!
從易於閱讀、維護和偵錯的角度來看,我更喜歡 HEREDOC 和 "...{$variable}..." 方法。
對於帶有佔位符的 HTML 標記區塊,到目前為止最快的是:-
?>
<div> 標記等等<?= $variable ?>更多標記
<?
我的測試包括 20 次迴圈運行,每次迴圈 100 萬次迭代,並使用輸出緩衝,在每次迴圈中拋棄緩衝區。
時間範圍從平均 2.1 毫秒/百萬次重複(用於 <?= $var ?> 方法)到使用 printf() 的 7.6 毫秒/百萬次。
我也會嘗試使用一些基準測試工具,因為這是我自己寫的,可能會引入偏差,但它們是在負載低的開發伺服器上執行的。
希望有趣。
當嘗試列出從 MySQL 回傳的資訊時,此函式有時會很有用
function print_sql($query,$printf){
$sql_sql = mysql_query($query);
while($sql = mysql_fetch_row($sql_sql)){
vprintf($printf,$sql);
}
}
不幸的是,當我嘗試建立一個參數以允許它包含在回傳的字串中時,它似乎偷偷地繞過了輸出緩衝...或者我沒有正確執行。