結論
配列を操作した後に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 から全ての値を取り出し、数値添字をつけた配列を返します。
つまり、配列でも連想配列でも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の文字列に変換されてしまう
- 配列を定義する
- 配列の特定の値を削除する(今回は3を削除)
- indexを詰める
- 配列を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も歴が浅く、記事も書き慣れてないので至らぬとこがあったらすんません。。。