1
0

More than 1 year has passed since last update.

【PHP】配列をjson_encodeするとlistじゃなくてobjectになる

Last updated at Posted at 2023-01-04

結論

配列を操作した後にjson_encodeするときはindexを詰めてから行おう!

ダメなパターン
json_encodeした結果listではなくObjectになっている

$array = array(1,2,3,3,3,4);

配列を操作...

echo $array; 
// -> array(1,2,4)

echo json_encode($array);
// -> {"0":1,"1":2,"5":4}

いいパターン
json_encodeした結果listのまま

$array = array(1,2,3,3,3,4);

配列を操作...

echo $array; 
// -> array(1,2,4)

// indexを詰める
$array = array_values($array);

echo json_encode($array);
// -> [1,2,4]

array_valuesでやってること

array_values() は、配列 array から全ての値を取り出し、数値添字をつけた配列を返します。

PHPマニュアルより

つまり、配列でも連想配列でもvalueのみを取り出し、数値添字のkeyを付け直しているって感じになる。
なので、以下のようにkeyがもともとある連想配列も消し去ることもできる。

$ar = array(
    'hoge'=> 0,
    'fuga'=> 1,
    'temp'=> 2
);

echo print_r($ar, true). "\n";
/*
->Array
(
    [hoge] => 0
    [fuga] => 1
    [temp] => 2
)
*/

echo print_r(json_encode($ar), true). "\n";
// -> {"hoge":0,"fuga":1,"temp":2}

// indexを詰める
$ar = array_values($ar);

echo print_r($ar, true). "\n";
/*
->Array
(
    [0] => 0
    [1] => 1
    [2] => 2
)
*/

echo print_r(json_encode($ar), true). "\n";
// -> [0,1,2]

実際に使ったパターン

以下の手順で操作を行なった時にindex詰める作業をしないとjson_encodeで変換した時にObjectの文字列に変換されてしまう

  1. 配列を定義する
  2. 配列の特定の値を削除する(今回は3を削除)
  3. indexを詰める
  4. 配列をjson_encodeで文字列に変換する

// step1 配列を定義する
$array = array(1,2,3,3,3,4);

// step2 配列の特定の値を削除する
foreach($array as $key => $value) {
    if($value == 3) {
        unset($array[$key]);
    }
}

// step3 indexを詰める
$array = array_values($array);

// step4 配列をjson_encodeで文字列に変換する
$tmp = json_encode($array);

// indexを詰めない場合
//     $tmp -> {"0":1,"1":2,"5":4}
// indexを詰めた場合
//     $tmp -> [1,2,4]

最後に

PHPも歴が浅く、記事も書き慣れてないので至らぬとこがあったらすんません。。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0