PHP Conference Japan 2024

vprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vprintf輸出格式化的字串

描述

vprintf(字串 $format, 陣列 $values): 整數

根據 format(在 sprintf() 的文件中說明)顯示格式化字串的陣列值。

運作方式如同 printf(),但接受一個引數陣列,而非可變數量的引數。

參數

format

格式字串由零或多個指示符組成:直接複製到結果的一般字元(不包括 %)和轉換規範,每個轉換規範都會導致提取自己的參數。

轉換規範遵循以下原型:%[argnum$][flags][width][.precision]specifier

Argnum

一個後面跟著錢字符號 $ 的整數,用於指定在轉換中要處理的引數編號。

Flags
旗標 描述
- 在給定的欄位寬度內左對齊;預設為右對齊
+ 在正數前面加上加號 +;預設只在負數前面加上負號。
(空格) 使用空格填充結果。這是預設值。
0 僅用零向左填充數字。使用 s 指示符也可以用零向右填充。
'(char) 使用字元 (char) 填充結果。

Width

一個整數,表示此轉換應產生多少個字元(最小值),或 *。如果使用 *,則寬度會作為附加的整數值提供,並位於由指示符格式化的值之前。

Precision

一個句點 .,可選擇後面跟著一個整數或 *,其含義取決於指示符

  • 對於 eEfF 指示符:這是小數點後要列印的位數(預設為 6)。
  • 對於 gGhH 指示符:這是要列印的最大有效位數。
  • 對於 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 指示符類似,但使用 Ef
h g 指示符類似,但使用 F。自 PHP 8.0.0 起提供。
H g 指示符類似,但使用 EF。自 PHP 8.0.0 起提供。
o 引數會被當成整數並以八進位數字呈現。
s 引數會被當成字串並呈現。
u 引數會被當成整數並以無符號十進位數字呈現。
x 引數會被當成整數並以十六進位數字呈現(使用小寫字母)。
X 引數會被當成整數並以十六進位數字呈現(使用大寫字母)。

警告

c 型別指示符會忽略填充和寬度。

警告

嘗試將字串和寬度指示符與每個字元需要多個位元組的字元集結合使用,可能會導致非預期的結果。

變數將被強制轉換為適合指示符的型別

型別處理
型別 指示符
字串 s
整數 ducoxXb
浮點數 eEfFgGhH

傳回值

傳回輸出字串的長度。

錯誤/例外

自 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

參見

新增筆記

使用者貢獻的筆記 8 筆筆記

10
steve at stevelockwood dot net
9 年前
如果傳遞的是物件而不是陣列,PHP 會自動將物件轉換為陣列,因此您可以直接在 vprintf 中使用它。
<?php
$object
= new stdClass();
$object->Property1 = 'Value 1';
$object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);

/* 會輸出
Value 1 Value 2
*/
?>
1
phpcoder at gmail dot com
5 年前
使用 ... 運算子,vprintf($format, $array) 基本上就等同於 printf($format, ...$array)。
0
取自 &#34;Php Phrasebook&#34;
16 年前
<?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] 將包含與第一個捕獲的括號子模式相符的文字,依此類推。
0
tehjosh at gamingg dot net
17 年前
致 toolofthesystem at gmail dot com

您不需要將 vprintf() 與輸出緩衝一起使用,因為您可以使用 vsprintf(),它的功能與 vprintf() 相同,但它會回傳結果字串而不是輸出它。
-1
caleb at tekhawk dot com
18 年前
我知道您可以使用 %1$s 或 %3$s 來選擇第一個或第三個字串,但是您如何或是否可以使用陣列名稱來選擇它

類似 %'user'$s $'email'$s

我傾向於隨著時間的推移向我的資料庫新增內容,這樣可以節省大量的重新編碼
-2
Chris
12 年前
另一種顯示陣列的方法是使用 array_walk()。這在無法使用 foreach 的內聯 echo/print 中非常有用,例如:

<?php
echo "這些錯誤:", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "必須修正。";
?>
-2
badcop666 at hotmail dot com
17 年前
根據我的測試,對於文字區塊,sprintf() 很慢。

此外,佔位符和實際變數或資料結構列表之間的對應關係通常會使程式碼難以閱讀。但是 printf() 系列受到廣泛支援,並且具有大量不錯的功能。但是,效能是很嚴苛的!

從易於閱讀、維護和偵錯的角度來看,我更喜歡 HEREDOC 和 "...{$variable}..." 方法。

對於帶有佔位符的 HTML 標記區塊,到目前為止最快的是:-

?>
<div> 標記等等<?= $variable ?>更多標記
<?

我的測試包括 20 次迴圈運行,每次迴圈 100 萬次迭代,並使用輸出緩衝,在每次迴圈中拋棄緩衝區。

時間範圍從平均 2.1 毫秒/百萬次重複(用於 <?= $var ?> 方法)到使用 printf() 的 7.6 毫秒/百萬次。

我也會嘗試使用一些基準測試工具,因為這是我自己寫的,可能會引入偏差,但它們是在負載低的開發伺服器上執行的。

希望有趣。
-2
toolofthesystem at gmail dot com
17 年前
當嘗試列出從 MySQL 回傳的資訊時,此函式有時會很有用

function print_sql($query,$printf){
$sql_sql = mysql_query($query);
while($sql = mysql_fetch_row($sql_sql)){
vprintf($printf,$sql);
}
}

不幸的是,當我嘗試建立一個參數以允許它包含在回傳的字串中時,它似乎偷偷地繞過了輸出緩衝...或者我沒有正確執行。
To Top