PHPの”json_encode()”は配列を与えられたときに、エンコード結果のJSONを配列として出力する場合とオブジェクトで出力する場合があります。
“json_encode()”でエンコードされるJSONの形式の条件がわからずハマったことがあるので、備忘録としてまとめておきます。
JSONが配列になるか、それともオブジェクトになるかは、配列のキーによって決まります。
配列のキーが連番でソートされていれば配列に、ソートされていない場合はオブジェクトになります。
文章だと伝わりにくいかもしれないので、サンプルコードの変換結果を見てみましょう。
配列のキーが連番でソートされていれば、JSONは配列に変換される
まずは配列に変換される場合です。
“$array1″は配列はわかりやすくするために、0からの連番をキーとして明示的に指定しています。
“$array2″キーを指定してはいませんが、”$array1″と同じように、0からの連番がキーとなっています。
<?php
$array1 = [
0 => 'a',
1 => 'b',
2 => 'c',
];
echo json_encode($array1);
// ["a","b","c"]
$array2 = ['A', 'B', 'C'];
echo json_encode($array2);
// ["A","B","C"]
配列のキーが連番でソートされていないと、JSONはオブジェクトに変換される
次にJSONがオブジェクトに変換される場合の例を記載します。
“$json1″はキーがソートされていない場合です。
ソート順を保持したままJSONに変換されるため、結果がオブジェクトになります。
注意したいのは、”$json2″のようにキーの途中に連番が抜けているケースです。
配列から要素を削除したときに、キーが抜け落ちてしまうことがあります。
連番を振り直すと配列に変換されるようになるので、配列で出力したい場合は“array_values()”を使用してキーを設定し直しましょう。
<?php
$json1 = [
2 => 'c',
0 => 'a',
1 => 'b',
];
echo json_encode($json1);
// {"2":"c","0":"a","1":"b"}
$json2 = [
0 => 'A',
2 => 'C',
];
echo json_encode($json2);
// {"0":"A","2":"C"}
array_values()を使ってキーを振り直す
array_values()を使って配列のキーの振り直しをしてみましょう。
キーの振り直す前の配列は、上記でオブジェクトに変換されていた配列を使用します。
<?php
$json1 = [
2 => 'c',
0 => 'a',
1 => 'b',
];
echo json_encode(array_values($json1));
// ["c","a","b"]
$json2 = [
0 => 'A',
2 => 'C',
];
echo json_encode(array_values($json2));
// ["A","C"]
データの順番を保持したままで、JSONを配列の形式で出力することができました。
エンコード結果が固定されていないと、結果を使用する処理でエラーが発生したり、どちらでも処理できるように対応しないとならないので、可能であればどちらかに固定するようにしたいですね。