次のコマンドを使用して、疎な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を使用しています。)
_json_decode
_は、デフォルトでstdClassタイプのオブジェクトを返します。プロパティとしてメンバーにアクセスします(つまり、_$result->test20
_)。 _10
_はプロパティの有効な名前ではないため、プロパティが失われます。
配列にキャストする代わりに、true
を_json_decode
_の2番目の引数として渡して、連想配列自体を返すようにすることができます。
$mynewarray = json_decode($json, true);
その場合、_$mynewarray[10]
_は正常に機能します。
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))
それはより良い結果を返すかもしれません。
問題は、オブジェクトから配列への変換にあります。
$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"