web-dev-qa-db-ja.com

スパースjsonオブジェクトをphp配列にデコードする

次のコマンドを使用して、疎なphp配列(またはマップ)を作成できます。

$myarray = array(10=>'hi','test20'=>'howdy');

これをJSONとしてシリアライズ/デシリアライズしたい。次のコマンドを使用してシリアル化できます。

$json = json_encode($myarray);

文字列{"10":"hi","test20":"howdy"}になります。ただし、これを逆シリアル化し、次のコマンドを使用して配列にキャストすると、

$mynewarray = (array)json_decode($json);

有効なphp識別子ではないキーとのマッピングが失われるようです。つまり、mynewarrayには'test20'=>'howdy'がマッピングされていますが、10=>'hi''10'=>'hi'もマッピングされていません。

標準のjson_encode/json_decode関数を使用してjsonとの間で変換するときに、phpマップの数値キーを保持する方法はありますか?

(PHPバージョン5.2.10-2ubuntu6.4を使用しています。)

22

_json_decode_は、デフォルトでstdClassタイプのオブジェクトを返します。プロパティとしてメンバーにアクセスします(つまり、_$result->test20_)。 _10_はプロパティの有効な名前ではないため、プロパティが失われます。

配列にキャストする代わりに、trueを_json_decode_の2番目の引数として渡して、連想配列自体を返すようにすることができます。

$mynewarray = json_decode($json, true);

その場合、_$mynewarray[10]_は正常に機能します。

47
Chris

PHPのバージョンは? 5.2では、次のプログラム/スクリプト

$myarray = array(10=>'hi','test20'=>'howdy');
$json = json_encode($myarray);
$mynewarray = (array) json_decode($json);
var_dump($mynewarray);

アウトプット

array(2) {
  ["10"]=>
  string(2) "hi"
  ["test20"]=>
  string(5) "howdy"
}

これは、あなたが説明している動作を表示しません。

とはいえ、PHPのバージョンがJSONを誤ってキャストしている場合は、json_decodeが返すstdClassオブジェクトでget_object_varsを使用してみてください

get_object_vars(json_decode($json))

それはより良い結果を返すかもしれません。

2
Alan Storm

問題は、オブジェクトから配列への変換にあります。

$a = (array)json_decode('{"10":"hi","test20":"howdy"}');
var_dump($a);

//outputs
array(2) {
  ["10"]=>
     string(2) "hi"
  ["test20"]=>
     string(5) "howdy"
}

この配列のインデックス"10"?しかし、PHPでは、特に配列インデックスの場合、数値のように見えるものはすべて数値に変換されます。 a["10"]変換するため"10"を数値に変換すると、この配列にはそのようなインデックスはありません。

ただし、foreachは機能します。

foreach ($a as $key => $value) {
   var_dump($key);
   var_dump($value);
}

//outputs
string(2) "10"
string(2) "hi"
string(6) "test20"
string(5) "howdy"

Json_decodeの結果をオブジェクトとして扱うこともできます。あなたはできなくなりますが$a->10または$a->"10"

$a = json_decode('{"10":"hi","test20":"howdy"}');
$b = 10;
var_dump($a->$b);

//outputs
string(2) "hi"

動作します。

しかし、おそらくクリスが言ったように、2番目の引数としてtrueを渡したいだけです。

$a = json_decode('{"10":"hi","test20":"howdy"}', true);
var_dump($a[10]);

//outputs
string(2) "hi"
2
vava