[PHP]データ記述言語と配列の対応


基本的なこと

PHPにはデータの格納手段に配列(Array)というものがあります。配列については山ほど資料があるのでArray やりたいことで調べたらすぐに出てきます。それぐらいに汎用性に優れ、多くの場面で使用されています。
そんな配列データを、ファイルなどに保存する機会は少なくありません。
そんなとき、読み込んだ時に元の配列のデータと同じにするために、データ記述言語が存在します。
データ記述言語とは主にJSONYAMLなどのことです。データを指定の形式通りに記述し保存することで、その形式に従って読めば保存したデータを完全に得ることができます。

配列の構造について理解する

配列は同じ用途の複数の「値」を1つのグループとして扱うためにあります。しかし、その値をさらに分類しておきたい場合は、分類名を「キー」としてその中にデータを格納することがあります。
キーがある配列は特別に「連想配列」といいます。PHPでは連想配列と普通の配列を区別せずに、「Array」として扱います。

キー

キーは要素を並列する場合には省略します。その場合、処理上ではキーには0, 1, 2...と連番が付されます。
PHPでは、キーに使用できるのは整数(int)か文字列(string)のみです。それ以外をキーにすると、整数または文字列に変換(toString())して格納されます。この変換の処理によっては、キーを正しく区別できないことがあります。

値には、どんなオブジェクトも格納できます。ですが、JSONなどのテキストファイルに保存する際はこれもまた整数または文字列に変換されます。データ記述言語に保存する配列は、必ず整数と文字列で構成する必要があります。

値に配列を入れることができます。これを「多次元配列」といい、入れ子のようにデータを記述できます。

配列のサンプル

  • 一般的な配列(下記の2例は混ぜることもできる)
$array = ["key1" => "value1", "key2" => "value2", "key3" => "value3"];
// "key1" => "value1", "key2" => "value2", "key3" => "value3"

$array = ["value1", "value2", "value3"];
// 0 => "value1", 1 => "value2", 2 => "value3"
  • 多次元配列(書き方は一般的な配列と同じ。値にまた配列を入れているだけ)
$array = [
  "keyA" => [
    "key1" => "value1",
    "key2" => "value2"
  ],
  "keyB" => [
    "key1" => "value3",
    "key2" => "value4"
  ]
];

値の参照

作った配列から値にアクセスするには、配列[キー]と入力します。

$array = [
  "keyA" => [
    "key1" => "value1",
    "key2" => "value2"
  ],
  "keyB" => [
    "key1" => "value3",
    "key2" => "value4"
  ]
];

// $array["keyA"] は ["key1" => "value1", "key2" => "value2"]
// $array["keyB"]["key2"] は "value4"

データ記述言語の形式にする

前述のとおり、PHPは連想配列であるかを区別しないですが、主なデータ記述言語はそれらを区別するので、その点に気を使わなければいけません。
次のような例を使います。これは図書館の十進分類法を参考にしました。本を細かく分類するコードです。

分野名 コード 分類名 分野名 コード 分類名
産業 0 産業 言語 0 言語
産業 1 農業 言語 1 日本語
産業 2 園芸 言語 2 中国語・その他の東洋の諸言語
産業 3 蚕糸業 言語 3 英語
産業 4 畜産業・獣医学 言語 4 ドイツ語

上の表を配列にする1つの例です。

$bunrui = [
  "産業" => [
    "産業", "農業", "園芸", "蚕糸業", "畜産業・獣医学"
  ],
  "言語" => [
    "言語", "日本語", "中国語・その他の東洋の諸言語", "英語", "ドイツ語"
  ]
];

// $bunrui["産業"] は ["産業", "農業", "園芸", "蚕糸業", "畜産業・獣医学"]
// $bunrui["言語"][1] は "日本語"

$bunruiは連想配列です。しかし、$bunrui["産業"]$bunrui["言語"]は連想配列ではありません。

これをJSONとYAMLにそれぞれ変換してみましょう。結果は以下の通りです。

JSON

JSON
{
  "産業": [
    "産業",
    "農業",
    "園芸",
    "蚕糸業",
    "畜産業・獣医学"
  ],
  "言語": [
    "言語",
    "日本語",
    "中国語・その他の東洋の諸言語",
    "英語",
    "ドイツ語"
  ]
}

JSONでは、連想配列は{キー: 値}の形、その他配列は[値, 値, 値...]の形になります。

YAML

YAML
---
産業:
- 産業
- 農業
- 園芸
- 蚕糸業
- 畜産業・獣医学
言語:
- 言語
- 日本語
- 中国語・その他の東洋の諸言語
- 英語
- ドイツ語
...

YAMLでは、連想配列はキー: 値の形、その他配列は

- 
- 
- 

の形になります。YAMLは括弧がないので少しわかりにくいです。
ただし、ほとんどの文字列は"(クオーテーション)で囲まなくていいので、楽ではあります。

ということで

PHPの配列データをデータ記述言語に変換するフォーマットを、構造を説明しつつ解説してみました。
どういう場面に連想配列にするか、どういうデータの形式にするかをよく考えて作ってみてください。

さいごに

phpのリファレンス最強伝説を残しておきます。
php.netを見ろ!!!!!!!!!!!!!読むんだ今すぐ!!!!!!!!!!!!!!!!!!!!!!!