【PHP】json_enode()で配列がオブジェクト型に変換されるのを阻止したい!


PHPで都道府県一覧をjsonで返却するAPIを作成した時に躓いたので、備忘として。

はじめに

配列の中にオブジェクト型のKeyValueを格納したいい感じのjsonを作りたい時って、ありますよね?

{
    "prefs": [
        {"1":"北海道"},
        {"2":"青森県"},
        {"3":"岩手県"},
        
    ]
}

このような構造にすれば、受け取り側でオブジェクトの順序が入れ替わることがないのでいい感じです。ただ、実際にPHPでこれを実装しようとしたところ以下のようになりました。

sample.php
$prefs_array = array('prefs' =>
    [
        '1' => '北海道',
        '2' => '青森県',
        '3' => '岩手県'
    ]
);
$prefs_json = json_encode($prefs_array);
$prefs_json
{
    "prefs": {
        "1":"北海道",
        "2":"青森県",
        "3":"岩手県",
        
    }
}

あれっ…これいつものjsonフォーマットや。これだとオブジェクトの順序の保証がされないのでなんとかしたいですね。

解法

json_encode()で変換する対象の配列を1次元配列ではなく2次元配列にします。

$prefs_array = array('pref' => 
    [
        array('1' => '北海道'),
        array('2' => '青森県'),
        array('3' => '岩手県'),
    ]
);
$prefs_json = json_encode($prefs_array);

こうすることで最初に提示したjsonフォーマットが作成できます。

参考