YAML
YAML(YAML Ain't Markup Language)は、人間が読み書きしやすい「設定・データ記述」フォーマット。インデントで構造を表し、コメントも書けます。
- YAMLの基本ルール(インデント/スカラー/配列/マップ)
- よくある落とし穴(タブ、コロン、文字列扱い)
- PHP/JSでYAMLを出力(エクスポート)
- INIを読み込んでYAMLに変換(インポート扱い)
yamlの歴史
#YAMLは「設定ファイルやデータ記述を、人が読みやすく書けるようにする」目的で生まれたフォーマットです。
JSONやXMLよりも手入力に向き、インデントで階層を表現できるのが特徴です。
- 人が読みやすい(改行・インデント・コメントが自然)
- 設定ファイルの用途でよく使われる(CI/CD、コンテナ、各種ツール)
- JSONと相互変換しやすい(表現できる構造が近い)
XML: 厳格・冗長・タグで表現
JSON: 厳格・機械向き・コメント不可
YAML: 人向き・コメントOK・インデントに注意yamlのルール
#YAMLは「インデント=構造」です。スペースで揃え、タブは避けるのが安全です。
また、型推論(true/false、数値、日付っぽい文字列)が起きることがあるため、“文字列にしたいもの”はクォートする運用が安定します。
- インデントはスペース(2 or 4 を統一)
- タブは使わない(環境差で事故りやすい)
- コロン「:」の後はスペース推奨(読みやすさ+事故防止)
- 先頭ゼロの値(0012)や日付(2026-02-08)は文字列扱いに注意(必要ならクォート)
- 複数行文字列は |(改行保持)または >(折りたたみ)
name: "SunStripe"
count: 3
pi: 3.14
enabled: true
# 日付っぽいものは文字列にしたいならクォート
published_at: "2026-02-08"
# 先頭ゼロもクォートで安全
zip_code: "001-0001"text_keep: |
これは改行を保持します。
2行目もそのまま。
text_fold: >
これは改行がスペースに
折りたたまれます(段落は保持)。サンプル
#YAMLでよく使う構造は「マップ(連想配列)」と「シーケンス(配列)」です。
ハイフン(-)が配列、キー: 値 が連想配列、という覚え方が最短です。
site:
name: SunStripe
url: https://sunstripe.main.jp/
pages:
- slug: yaml
title: YAML
tags: [config, data]
- slug: ini
title: INI
tags:
- config
- legacyuser:
id: 12
profile:
name: "きゃらあげ"
role: ["プログラマー", "シナリオライター"]
settings:
theme: dark
notify:
email: true
push: falseyamlのエクスポート
#「配列/オブジェクト」からYAML文字列を生成して保存する例です。
注意:PHP本体にはYAMLの標準関数が無い環境もあるため、ここでは“シンプルなYAML生成(基本型のみ)”の自作関数例を載せています。複雑な型や厳密な仕様対応が必要なら、YAML対応ライブラリ(Symfony/Yaml 等)を使うのが安全です。
<?php
// 基本型のみ対応の簡易YAML出力(学習用)
function to_yaml($data, int $indent = 0): string {
$sp = str_repeat(' ', $indent);
if (is_array($data)) {
$isList = array_keys($data) === range(0, count($data) - 1);
$out = "";
if ($isList) {
foreach ($data as $v) {
if (is_array($v)) {
$out .= $sp . "-\n" . to_yaml($v, $indent + 1);
} else {
$out .= $sp . "- " . yaml_scalar($v) . "\n";
}
}
} else {
foreach ($data as $k => $v) {
$key = (string)$k;
if (is_array($v)) {
$out .= $sp . $key . ":\n" . to_yaml($v, $indent + 1);
} else {
$out .= $sp . $key . ": " . yaml_scalar($v) . "\n";
}
}
}
return $out;
}
return $sp . yaml_scalar($data) . "\n";
}
function yaml_scalar($v): string {
if (is_bool($v)) return $v ? 'true' : 'false';
if ($v === null) return 'null';
if (is_int($v) || is_float($v)) return (string)$v;
// 文字列:危ない文字がある/日付っぽい/先頭ゼロなどはクォート
$s = (string)$v;
$needsQuote = false;
if ($s === '' || preg_match('/[\n\r\t:#\[\]{}&,*>!|%"\'@`]/u', $s)) $needsQuote = true;
if (preg_match('/^0\d+/u', $s)) $needsQuote = true;
if (preg_match('/^\d{4}-\d{2}-\d{2}/u', $s)) $needsQuote = true;
if (in_array(strtolower($s), ['true','false','null','yes','no','on','off'], true)) $needsQuote = true;
if ($needsQuote) {
$s = str_replace('"', '\\"', $s);
return '"' . $s . '"';
}
return $s;
}
$data = [
'site' => ['name' => 'SunStripe', 'url' => 'https://sunstripe.main.jp/'],
'build' => ['enabled' => true, 'retry' => 3],
'tags' => ['config', 'yaml', 'example'],
'published_at' => '2026-02-08'
];
$yaml = to_yaml($data);
file_put_contents(__DIR__ . '/exported.yaml', $yaml);
echo $yaml;
?>// 学習用(基本型のみ)
function toYAML(obj, indent = 0){
const sp = " ".repeat(indent);
if (Array.isArray(obj)){
return obj.map(v => {
if (v && typeof v === 'object') return `${sp}-\n${toYAML(v, indent+1)}`;
return `${sp}- ${scalar(v)}\n`;
}).join("");
}
if (obj && typeof obj === 'object'){
return Object.entries(obj).map(([k,v]) => {
if (v && typeof v === 'object') return `${sp}${k}:\n${toYAML(v, indent+1)}`;
return `${sp}${k}: ${scalar(v)}\n`;
}).join("");
}
return `${sp}${scalar(obj)}\n`;
}
function scalar(v){
if (v === null) return 'null';
if (typeof v === 'boolean') return v ? 'true' : 'false';
if (typeof v === 'number') return String(v);
let s = String(v);
const needs = s === '' || /[\n\r\t:#\[\]{}&,*>!|%"'@`]/.test(s) || /^0\d+/.test(s);
if (needs) s = '"' + s.replace(/"/g,'\\"') + '"';
return s;
}
const data = {
site:{ name:'SunStripe', url:'https://sunstripe.main.jp/' },
tags:['yaml','config'],
enabled:true,
};
console.log(toYAML(data));iniのインポート(INI→YAML変換)
#INIを読み込み、PHP配列にした上でYAMLとして出力する例です。
INIはセクション([app]など)を持てます。PHPの parse_ini_file を使うと簡単に配列化できます(TRUEでセクション付き)。
[app]
name = "SunStripe"
debug = true
retry = 3
[db]
host = localhost
port = 3306
user = root
pass = "secret"<?php
// 1) INI読み込み(セクションあり)
$iniPath = __DIR__ . '/config.ini';
$data = parse_ini_file($iniPath, true, INI_SCANNER_TYPED);
if ($data === false) {
throw new RuntimeException('INIを読み込めません');
}
// 2) YAML化(exportセクションの to_yaml/yaml_scalar を流用)
function to_yaml($data, int $indent = 0): string {
$sp = str_repeat(' ', $indent);
if (is_array($data)) {
$isList = array_keys($data) === range(0, count($data) - 1);
$out = "";
if ($isList) {
foreach ($data as $v) {
if (is_array($v)) $out .= $sp . "-\n" . to_yaml($v, $indent + 1);
else $out .= $sp . "- " . yaml_scalar($v) . "\n";
}
} else {
foreach ($data as $k => $v) {
$key = (string)$k;
if (is_array($v)) $out .= $sp . $key . ":\n" . to_yaml($v, $indent + 1);
else $out .= $sp . $key . ": " . yaml_scalar($v) . "\n";
}
}
return $out;
}
return $sp . yaml_scalar($data) . "\n";
}
function yaml_scalar($v): string {
if (is_bool($v)) return $v ? 'true' : 'false';
if ($v === null) return 'null';
if (is_int($v) || is_float($v)) return (string)$v;
$s = (string)$v;
$needsQuote = false;
if ($s === '' || preg_match('/[\n\r\t:#\[\]{}&,*>!|%"\'@`]/u', $s)) $needsQuote = true;
if (preg_match('/^0\d+/u', $s)) $needsQuote = true;
if (preg_match('/^\d{4}-\d{2}-\d{2}/u', $s)) $needsQuote = true;
if (in_array(strtolower($s), ['true','false','null','yes','no','on','off'], true)) $needsQuote = true;
if ($needsQuote) {
$s = str_replace('"', '\\"', $s);
return '"' . $s . '"';
}
return $s;
}
$yaml = to_yaml($data);
file_put_contents(__DIR__ . '/config.yaml', $yaml);
echo $yaml;
?>・INIは「配列の配列」表現が弱い(ツール依存)
・INI_SCANNER_TYPED を使うと true/false/数値が型付きで取れる
・機密値(pass等)はコミットしない運用が安全取り扱い・プライバシー
#このページのサンプルは、ブラウザ上の表示とコピーを目的にしています。フォーム送信・アップロード機能はありません。 実運用でYAML/INIを扱う場合は、機密情報(APIキー、トークン、パスワード)をリポジトリに含めない運用にしてください。
- .env やシークレット管理(CI/CDのSecret等)を使う
- 公開用のサンプル値に置き換える
- アクセス権限(chmod)とバックアップの範囲を見直す
免責事項
#本ページの内容は学習用です。環境差・バージョン差・入力データの差により、実際の挙動が異なる場合があります。 重要な設定や本番データに適用する前に、必ず検証環境でテストしてください。