PHP の Symfony Yaml 2.5.7 と、Ruby 2.1.5 の yaml で確認しています。
Ruby の yaml は Psych という libyaml のラッパーらしいので、libyaml が使われている場合は概ね同じなのではないでしょうか。
一方 PHP の Symfony Yaml はパーサが独自に実装されています。
次のようにマッピング(連想配列)のキー部分に <<
を記述し、要素をマッピングのシーケンス(配列)にすると・・・
<<:
- a: 1
b: 2
- c: 3
d: 4
e: 5
次のようにマッピングがマージされます。
a: 1
b: 2
c: 3
d: 4
e: 5
Ruby の yaml だとフロースタイルで次のようにも記述できました。
{ <<: [ {a: 1, b: 2}, {c: 3, d: 4} ], e: 5 }
が、PHP の Symfony Yaml だとこの形式は "<<" というキーを持つ連想配列になってしまいました。
アンカーとエイリアスを組み合わせて、次のように使うと便利です。
base: &base
a: 1
b: 2
c: 3
ore:
<<: [*base]
a: 0
are:
<<: [*base]
x: 9
と、思ったら、次のようにも書けました。
base: &base
a: 1
b: 2
c: 3
ore:
<<: *base
a: 0
are:
<<: *base
x: 9
んん?
次の形式は PHP の Symfony Yaml だとマージされましたが、Ruby の yaml だとマージされませんでした。
<<:
a: 1
b: 2
c: 3
d: 4
e: 5
次の形式は PHP も Ruby もマージされませんでした。
{ <<: { a: 1, b: 2, c: 3, d: 4 }, e: 5 }
次の形式のようにエイリアスだと PHP でも Ruby でもマージされました。
- base: &base
a: 1
b: 2
c: 3
d: 4
- <<: *base
e: 5
フロースタイルだと Ruby ならマージされますが、PHP だとやっぱりマージされませんでした。
- base: &base { a: 1, b: 2, c: 3, d: 4 }
- { <<: *base, e: 5 }
うーん?
よくわからないので YAML の仕様を確認しようとしたのですが、記述が見つかりませんでした。
下記の記事によると・・・
下記にちらっとだけ書かれていました。
るびまにも書かれていたようですが NoMethodError とかなっていて表示されていません。