JSONからPHP配列へ

JSONドキュメントを貼り付けると、.phpソースファイル用に整形されたPHP配列リテラルが得られます。短い配列構文([...])、適切なインデント、正しく引用符で囲まれた文字列、連想配列になるネストされたオブジェクト、そしてインデックスを保ったままの配列が特徴です。テストにAPIのフィクスチャを埋め込んだり、設定ファイルの初期値を用意したりするのに便利です。

JSONをPHPに変換する方法

  1. 1

    JSONを貼り付ける

    有効なJSONであれば何でも(オブジェクト、配列、深くネストされたものも)。

  2. 2

    構文を選ぶ

    短い`[...]`(PHP 5.4以降)または長い`array(...)`(現在はほとんど不要)。

  3. 3

    文字列の引用符を選ぶ

    シングルクォート(変数展開なし、アポストロフィはエスケープ)またはダブルクォート(`$`の変数展開が有効。データ用途では通常は不向き)。

  4. 4

    配列をコピーする

    `.php`ファイルに貼り付け、`return`に割り当てるか、`config([...])`で囲みます。

入力:

{ "app": { "name": "Hyperion", "debug": true, "hosts": ["h1.example.com", "h2.example.com"] } }

出力(短い構文、シングルクォート):

[
    'app' => [
        'name' => 'Hyperion',
        'debug' => true,
        'hosts' => [
            'h1.example.com',
            'h2.example.com',
        ],
    ],
]

型の対応

JSON PHP
文字列 文字列(シングルクォート)
整数 int
数値(小数) float
真偽値 true / false
null null
配列(JSON) インデックス配列
オブジェクト(JSON) 連想配列

連想配列とインデックス配列の使い分け

PHPには両方の振る舞いを持つ単一の配列型があります。一方、JSONはオブジェクトと配列を明確に区別するため、対応は次のとおりです。

  • {} → 連想配列(['key' => value])。
  • [] → インデックス配列([value, value])。

ジェネレーターは常にこの区別を保持します。PHPでは両者を混在させることも可能ですが、混乱を招きます。

PHP特有の落とし穴

  • 数値文字列のキー。 PHPは配列内の"42"を整数キー42に変換します。JSONで数値文字列をキーとして使い、それを文字列のまま保持したい場合、array_combineによるラウンドトリップでは保持されません。
  • 大きな整数。 JSONは32ビット環境のPHP_INT_MAXを超える整数を保持できます。その可能性がある場合、ジェネレーターは警告します。
  • UTF-8。 PHPの文字列はバイト列であり、ジェネレーターはUTF-8をそのまま出力します。.phpファイルはBOMなしのUTF-8で保存してください。

使用例

  • 設定ファイル:LaravelもSymfonyもPHP配列による設定を使います。ベンダー配布のJSON設定をそのまま取り込むのに適しています。
  • テストフィクスチャPHPUnitのフィクスチャは、実行時に読み込むJSONファイルよりも配列のほうが扱いやすくなります。
  • シーダー:Laravelのデータベースシーダーは、JSONダンプから始めてPHP配列に変換することがよくあります。

よくある間違い

  • PHP配列をJSONに戻す。 json_encodeは連想配列をオブジェクトとして、インデックス配列を配列として扱います。両者を混在させる(['key' => 'val', 0 => 'x'])と、出力はオブジェクトになります。JSON形式の配列はJSON形式のまま保ちましょう。
  • アポストロフィを含むダブルクォート。 シングルクォートのPHP文字列は\'をエスケープする必要があり、ダブルクォートの文字列は\\"をエスケープする必要があるうえ、注意しないと変数が意図せず展開されます。データにはシングルクォートを使いましょう。
  • 末尾のカンマの付け忘れ。 PHPはPHP 7.3以降で末尾のカンマを許可しており、差分がきれいになります。ジェネレーターはデフォルトで付加します。

よくある質問

短い構文([...])はPHP 5.4以降で利用でき、現代のあらゆるコードで慣用的な選択肢です。長い構文(array(...))は、PHP 5.3以前で動作させる必要があるコード、つまり基本的にはレガシーシステムでのみ必要です。

はい。Laravelの設定ファイルは、ファイルから返される単純なPHP配列です。ジェネレーターの出力をreturnの後に貼り付け、config/に保存してください。

シングルクォートのPHP文字列は、変数やエスケープシーケンスを展開しません(\'\\は例外)。データリテラルではこのほうが高速で安全です。ダブルクォートは、文字列内に\n\t$variableを入れたい場合にのみ意味を持ちます。

いいえ、出力するのは配列リテラルです。必要に応じてreturnconst、クラスのプロパティなどでご自身で囲んでください。出力を小さく保つことで組み合わせやすくなります。

関連ツール

このツールは他の言語でも利用できます