👻

PHPの配列をJSONにする時は気を付けよう

2024/01/24に公開

概要

PHPの配列をjson_encode()でJSONに変換している次のコードを実行してみてください。

sample1.php
$array = ["Tom", "Alice", "Bob"];

$nameList = [];

foreach($array as $key => $item) {
    if ($item !== "Tom") {
        $nameList[$key] = $item;
    }
}

echo json_encode($nameList);
// {"1":"Alice","2":"Bob"}

配列に格納する際にキーを明示的に指定しています。
これでは配列のキーの0からの連番が崩れてしまい、結果的に配列ではなく連想配列としてオブジェクトに変換されます。

sample2.php
$array = ["Tom", "Alice", "Bob"];

$nameList = [];

foreach($array as $key => $item) {
    if ($item !== "Bob") {
        $nameList[$key] = $item;
    }
}

echo json_encode($nameList);
// ["Tom","Alice"]

一方で、0からの連番が崩れなければオブジェクトではなく配列に変換されます。

sample3.php
$array = ["Tom", "Alice", "Bob"];

$nameList = [];

foreach($array as $key => $item) {
    if ($item !== 'Tom') {
        $nameList[] = $item;
    }
}

echo json_encode($nameList);
// ["Alice","Bob"]

配列に格納する際にキーを指定しないことで、キーが振り直されそのまま配列へと変換されます。

sample4.php
$array = ["Tom", "Alice", "Bob"];

$nameList = array_filter($array, fn($item) => $item !== 'Tom');

echo json_encode($nameList);
// {"1":"Alice","2":"Bob"}

$nameList = array_filter($array, fn($item) => $item !== 'Bob');

echo json_encode($nameList);
// ["Tom","Alice"]

array_filter()ではキーを明示的に指定した場合と同様の挙動になるようです。

sample5.php
$array = ["Tom", "Alice", "Bob"];

$nameList = array_filter($array, fn($item) => $item !== 'Tom');

echo json_encode(array_values($nameList));
// ["Alice","Bob"]

また、array_values()を使用することで配列のキーを振り直すことができ、インデックスの崩れた配列でもそのまま配列に変換することが出来ます。

Discussion