【PHP8.x】parse_ini_string関数の使い方
parse_ini_string関数は、INI形式で記述された文字列を解析し、その内容をPHPの連想配列に変換する処理を実行する関数です。この関数は、設定情報をファイルからではなく、文字列として直接扱いたい場合に利用されます。第一引数には解析対象のINI形式の文字列を指定します。第二引数のprocess_sections
をtrue
に設定すると、INI文字列内のセクション構造を維持した多次元の連想配列が返されます。デフォルトのfalse
の場合は、セクションは無視され、すべての設定項目が一次元の連想配列に格納されます。さらに、第三引数のscanner_mode
を指定することで、値の解析方法を変更できます。例えば、INI_SCANNER_TYPED
モードを使用すると、true
、false
、null
といった文字列や数値が、自動的に対応するデータ型(ブール値、NULL、整数)に変換されます。関数の実行が成功した場合は連想配列が返り、解析に失敗した場合はfalse
が返されます。
基本的な使い方
構文(syntax)
parse_ini_string(string $string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array|false
引数(parameters)
string $string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL
- string $string: 解析するINI形式の文字列
- bool $process_sections = false: trueを指定すると、セクション名をキーとした多次元配列として解析します
- int $scanner_mode = INI_SCANNER_NORMAL: 解析モードを指定します。INI_SCANNER_NORMAL(デフォルト)は通常のINI形式、INI_SCANNER_RAWはエスケープシーケンスを解釈しません
戻り値(return)
array|false
ini文字列を解析して、設定項目を連想配列として返します。解析に失敗した場合はfalseを返します。
サンプルコード
PHP parse_ini_string
でINI文字列を配列に変換する
<?php
/**
* parse_ini_string関数の基本的な使い方を示すサンプルコードです。
* この関数は、INI形式の文字列をPHPの連想配列に変換するために使用されます。
* システムエンジニアを目指す初心者向けに、設定ファイルをメモリ上で扱う方法を解説します。
*/
// INI形式の文字列を定義します。
// 実際には、この文字列はファイルから読み込まれることが多いですが、ここでは直接記述します。
$iniString = <<<INI
; これはコメントです。INIパーサーによって無視されます。
[database]
host = "localhost"
port = 3306
user = "root"
password = "mysecretpassword"
; キー 'port' は整数として、'password' は文字列として解釈されます。
[app_settings]
debug_mode = On
max_items = 100
app_name = "My Awesome App"
base_url = "https://example.com"
; 'On' はブール値の true に、'max_items' は整数に、'app_name' と 'base_url' は文字列として解釈されます。
INI;
echo "--- 元のINI文字列 ---" . PHP_EOL;
echo $iniString . PHP_EOL . PHP_EOL;
// 1. セクションを処理する場合(第二引数に true を指定)
// これが最も一般的な使用方法で、INIファイルのセクション(例: [database])を
// 配列のトップレベルのキーとして扱います。
echo "--- パース結果 (セクションを処理する場合: 第二引数 'true') ---" . PHP_EOL;
$configWithSections = parse_ini_string($iniString, true);
// パース結果が正常に配列として返されたかを確認します。
// エラーが発生した場合(INI文字列の形式が不正など)は false が返されます。
if ($configWithSections !== false) {
// 結果の配列を分かりやすく整形して表示します。
print_r($configWithSections);
echo PHP_EOL;
// パースされた設定値にアクセスする例:
echo "データベースホスト: " . $configWithSections['database']['host'] . PHP_EOL;
echo "アプリケーション名: " . $configWithSections['app_settings']['app_name'] . PHP_EOL;
echo "デバッグモード有効? " . ($configWithSections['app_settings']['debug_mode'] ? 'はい' : 'いいえ') . PHP_EOL;
} else {
echo "INI文字列のパースに失敗しました。(セクション処理あり)" . PHP_EOL;
}
echo PHP_EOL . "--- パース結果 (セクションを処理しない場合: 第二引数 'false') ---" . PHP_EOL;
// 2. セクションを処理しない場合(第二引数に false を指定)
// この場合、セクションは無視され、すべてのキーと値が一次元の連想配列としてパースされます。
// 同じキー名が複数のセクションに存在する場合、後から出現した値で上書きされます。
// 今回の例ではキーが重複していないため、すべてのキーがフラットに並びます。
$configWithoutSections = parse_ini_string($iniString, false);
if ($configWithoutSections !== false) {
print_r($configWithoutSections);
echo PHP_EOL;
// セクションなしでアクセスする例:
// セクションが無視されるため、直接キー名でアクセスします。
echo "データベースユーザー: " . $configWithoutSections['user'] . PHP_EOL; // 'database' セクションの 'user'
echo "最大アイテム数: " . $configWithoutSections['max_items'] . PHP_EOL; // 'app_settings' セクションの 'max_items'
} else {
echo "INI文字列のパースに失敗しました。(セクション処理なし)" . PHP_EOL;
}
?>
PHPのparse_ini_string
関数は、INI形式の文字列をPHPの連想配列に変換するために使用されます。この関数を活用することで、システムの設定情報やアプリケーションの構成などを、メモリ上で手軽に扱い、動的に変更することが可能になります。
関数には、まずINI形式のテキストを$string
引数として渡します。2番目の引数$process_sections
はブール値で、true
を指定すると、INIファイル内の[database]
のようなセクションが連想配列のトップレベルのキーとして処理され、そのセクション内のキーと値がさらにサブ配列として格納されます。これにより、設定情報をグループごとに整理して扱うことができます。一方、false
を指定するとセクションは無視され、すべてのキーと値がフラットな一次元の連想配列として変換されます。
関数が正常に処理を完了すると、変換された連想配列が戻り値として返されます。しかし、渡されたINI文字列の形式が不正であるなど、パースに失敗した場合にはfalse
が返されるため、戻り値がfalse
でないかを確認する処理は重要です。サンプルコードでは、$process_sections
をtrue
にした場合とfalse
にした場合のそれぞれのパース結果と、それらの配列から設定値にアクセスする方法を具体的に示しています。
parse_ini_string
関数はINI形式の文字列をPHPの連想配列に変換しますが、パースに失敗するとfalse
を返すため、必ず戻り値がfalse
でないか確認し、適切にエラー処理を行ってください。第二引数にtrue
を指定すると、INIファイルのセクションが配列のキーとして認識され、ネストされた配列が生成されます。false
を指定するとセクションが無視され、すべてのキーがフラットな一次元配列になりますが、同じキー名がある場合は後から出現した値で上書きされます。また、INI形式では"On"や"Yes"がブール値のtrue
に、数値が整数に自動変換される特性も理解して利用してください。設定ファイルに機密情報を含む場合があるため、文字列の取得元や扱いにセキュリティ上の注意を払う必要があります。