json_encode()でPHPの配列をJSONにする場合に、PHPの配列の内容によってJSONの配列(Array)になるかハッシュ(JSONの場合KEYが文字列のプロパティの集合)になるかを調べてみた。
PHPの連想配列(KEYあり)の場合
$arr = array('foo' => 'a', 'bar' => 'b', 'baz' => 'c');
echo json_encode($arr);
// => {"foo":"a","bar":"b","baz":"c"}
→JSONのハッシュになった。
PHPの配列(KEY指定なし=ゼロから始まる連番)の場合
$arr = array('a', 'b', 'c');
echo json_encode($arr);
// => ["a","b","c"]
→JSONの配列になった。
PHPの配列を、json_encode()のオプション指定で強制的にハッシュにした場合
$arr = array('a', 'b', 'c');
echo json_encode($arr, JSON_FORCE_OBJECT);
// => {"0":"a","1":"b","2":"c"}
→JSONのハッシュになった。
PHPの連想配列で、一部だけKEY指定なしの場合
$arr = array('foo' => 'a', 'b', 'baz' => 'c');
echo json_encode($arr);
// => {"foo":"a","0":"b","baz":"c"}
→JSONのハッシュになった。
PHPの配列から最初の要素を消した場合
$arr = array('a', 'b', 'c');
unset($arr[0]);
echo json_encode($arr);
// => {"1":"b","2":"c"}
→JSONのハッシュになった。
PHPの配列から
最初 途中の要素を消した場合
$arr = array('a', 'b', 'c');
unset($arr[1]);
echo json_encode($arr);
// => {"0":"a","2":"c"}
→JSONのハッシュになった。
PHPの配列から最後の要素を消した場合
$arr = array('a', 'b', 'c');
unset($arr[2]);
echo json_encode($arr);
// => ["a","b"]
→JSONの配列になった!
PHPの連想配列でKEYをゼロから始まる連番で指定した場合
$arr = array(0 => 'a', 1 => 'b', 2 => 'c');
echo json_encode($arr);
// => ["a","b","c"]
→JSONの配列になった。
PHPの連想配列でKEYを数値だけど連番じゃないものにした場合
$arr = array(0 => 'a', 1 => 'b', 4 => 'c');
echo json_encode($arr);
// => {"0":"a","1":"b","4":"c"}
→JSONのハッシュになった。
結論
json_encode()により配列(Array)になるのは、PHPの(連想)配列のKEYが
ゼロから始まる連番の場合のみ。