現在の位置: ホーム> 最新記事一覧> VFPRINTFを使用して、複数のデータ型のフォーマットされたコンテンツを出力します

VFPRINTFを使用して、複数のデータ型のフォーマットされたコンテンツを出力します

gitbox 2025-05-29

vfprintf()とは何ですか?

VFPRINTF()は、指定されたファイルストリームにフォーマットされた文字列を書き込むためにPHPによって提供される関数です。 fprintf()とは異なり、 vfprintf()はパラメーターリストの配列を受信します。これにより、複数のタイプのデータを動的にスプライシングおよび処理すると、より柔軟になります。

関数定義:

 int vfprintf ( resource $handle , string $format , array $args )
  • $ハンドル:ファイルポインターリソース、通常はfopen()によって返されます。

  • $フォーマット:フォーマット文字列。

  • $ args :フォーマットされた文字列に挿入されるデータの配列。


フォーマット文字列でサポートされているデータ型

vfprintf()では、一連の形式識別子を使用して、さまざまな種類の出力をサポートできます。一般的なものは次のとおりです。

  • %S :文字列

  • %D :整数(小数)

  • %F :浮動小数点数

  • %X :ヘキサデシマル(小文字)

  • %X :ヘキサデシマル(キャップ​​)

  • %B :バイナリ

  • %C :ASCII文字

これらの識別子は、修飾子(精度、パディングなど)と組み合わせて、より複雑な出力要件を完了することができます。


実用的な例

例1:文字列と整数を書きます

<?php
$fp = fopen("log.txt", "a");
$name = "Alice";
$age = 30;
vfprintf($fp, "Name: %s, Age: %d\n", array($name, $age));
fclose($fp);
?>

このコードは、 log.txtファイルに以下を書き込みます。

 Name: Alice, Age: 30

例2:浮動小数点番号を書いて、2つの小数点を保持します

<?php
$fp = fopen("log.txt", "a");
$product = "Coffee";
$price = 19.456;
vfprintf($fp, "Product: %s, Price: \$%.2f\n", array($product, $price));
fclose($fp);
?>

出力:

 Product: Coffee, Price: $19.46

%.2Fは、2つの小数点を保持することを意味します。


例3:URLを動的に生成してファイルを書き込みます

<?php
$fp = fopen("links.txt", "a");
$endpoint = "api/data";
$id = 42;
$url = "https://gitbox.net/%s?id=%d";
vfprintf($fp, $url."\n", array($endpoint, $id));
fclose($fp);
?>

ファイルに書かれた内容は次のとおりです。

 https://gitbox.net/api/data?id=42

例4:混合タイプの書き込みログ

<?php
$fp = fopen("debug.log", "a");
$time = date("Y-m-d H:i:s");
$userId = 101;
$success = true;
$ip = "192.168.1.10";
vfprintf($fp, "[%s] User ID: %d, Success: %s, IP: %s\n", array(
    $time, $userId, $success ? "true" : "false", $ip
));
fclose($fp);
?>

出力は似ています:

 [2025-05-29 15:30:00] User ID: 101, Success: true, IP: 192.168.1.10

ヒントと予防策

  1. セキュリティ:ユーザー入力が形式の文字列に直接スプライスされないようにし、フォーマットインジェクション攻撃を防ぎます。

  2. 配列の順序は正確でなければなりません。パラメーター配列は、形式の文字列に1つずつ対応する必要があり、順序は間違っていません。

  3. ファイル許可:書かれたファイルに書き込み許可があることを確認してください。そうしないと、 Fopen()またはvfprintf()が失敗します。

  4. 多言語の適応:出力をフォーマットする場合、 Sprintf()vprintf()で前処理できます。