Programming Lab
DATA FORMAT

YAML

YAML(YAML Ain't Markup Language)は、人間が読み書きしやすい「設定・データ記述」フォーマット。インデントで構造を表し、コメントも書けます。

歴史 ルール サンプル エクスポート INI→YAML
このページでできること
  • YAMLの基本ルール(インデント/スカラー/配列/マップ)
  • よくある落とし穴(タブ、コロン、文字列扱い)
  • PHP/JSでYAMLを出力(エクスポート)
  • INIを読み込んでYAMLに変換(インポート扱い)

yamlの歴史

#

YAMLは「設定ファイルやデータ記述を、人が読みやすく書けるようにする」目的で生まれたフォーマットです。

JSONやXMLよりも手入力に向き、インデントで階層を表現できるのが特徴です。

  • 人が読みやすい(改行・インデント・コメントが自然)
  • 設定ファイルの用途でよく使われる(CI/CD、コンテナ、各種ツール)
  • JSONと相互変換しやすい(表現できる構造が近い)
位置づけ(ざっくり)
text
XML: 厳格・冗長・タグで表現
JSON: 厳格・機械向き・コメント不可
YAML: 人向き・コメントOK・インデントに注意

yamlのルール

#

YAMLは「インデント=構造」です。スペースで揃え、タブは避けるのが安全です。

また、型推論(true/false、数値、日付っぽい文字列)が起きることがあるため、“文字列にしたいもの”はクォートする運用が安定します。

  • インデントはスペース(2 or 4 を統一)
  • タブは使わない(環境差で事故りやすい)
  • コロン「:」の後はスペース推奨(読みやすさ+事故防止)
  • 先頭ゼロの値(0012)や日付(2026-02-08)は文字列扱いに注意(必要ならクォート)
  • 複数行文字列は |(改行保持)または >(折りたたみ)
スカラー(値)の例
yaml
name: "SunStripe"
count: 3
pi: 3.14
enabled: true
# 日付っぽいものは文字列にしたいならクォート
published_at: "2026-02-08"
# 先頭ゼロもクォートで安全
zip_code: "001-0001"
複数行文字列(| と >)
yaml
text_keep: |
  これは改行を保持します。
  2行目もそのまま。

text_fold: >
  これは改行がスペースに
  折りたたまれます(段落は保持)。

サンプル

#

YAMLでよく使う構造は「マップ(連想配列)」と「シーケンス(配列)」です。

ハイフン(-)が配列、キー: 値 が連想配列、という覚え方が最短です。

マップ+配列(基本形)
yaml
site:
  name: SunStripe
  url: https://sunstripe.main.jp/

pages:
  - slug: yaml
    title: YAML
    tags: [config, data]
  - slug: ini
    title: INI
    tags:
      - config
      - legacy
ネスト(入れ子)
yaml
user:
  id: 12
  profile:
    name: "きゃらあげ"
    role: ["プログラマー", "シナリオライター"]
  settings:
    theme: dark
    notify:
      email: true
      push: false

yamlのエクスポート

#

「配列/オブジェクト」からYAML文字列を生成して保存する例です。

注意:PHP本体にはYAMLの標準関数が無い環境もあるため、ここでは“シンプルなYAML生成(基本型のみ)”の自作関数例を載せています。複雑な型や厳密な仕様対応が必要なら、YAML対応ライブラリ(Symfony/Yaml 等)を使うのが安全です。

PHP:配列→YAML(簡易)→保存
php
<?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;
?>
JS:オブジェクト→YAML(超簡易)
javascript
// 学習用(基本型のみ)
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でセクション付き)。

INIサンプル
ini
[app]
name = "SunStripe"
debug = true
retry = 3

[db]
host = localhost
port = 3306
user = root
pass = "secret"
PHP:INI→配列→YAML(変換)
php
<?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→YAML)
text
・INIは「配列の配列」表現が弱い(ツール依存)
・INI_SCANNER_TYPED を使うと true/false/数値が型付きで取れる
・機密値(pass等)はコミットしない運用が安全

取り扱い・プライバシー

#

このページのサンプルは、ブラウザ上の表示とコピーを目的にしています。フォーム送信・アップロード機能はありません。 実運用でYAML/INIを扱う場合は、機密情報(APIキー、トークン、パスワード)をリポジトリに含めない運用にしてください。

  • .env やシークレット管理(CI/CDのSecret等)を使う
  • 公開用のサンプル値に置き換える
  • アクセス権限(chmod)とバックアップの範囲を見直す

免責事項

#

本ページの内容は学習用です。環境差・バージョン差・入力データの差により、実際の挙動が異なる場合があります。 重要な設定や本番データに適用する前に、必ず検証環境でテストしてください。