22

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

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

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

$json = json_encode($myarray);

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

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

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

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

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

4

3 に答える 3

47

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

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

$mynewarray = json_decode($json, true);

そうすれば、うまくいきます$mynewarray[10]

于 2010-03-20T20:58:09.497 に答える
2

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))

その方が良い結果が返ってくるかもしれません。

于 2010-03-20T20:59:27.503 に答える
2

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

$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"

動作します。

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

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

//outputs
string(2) "hi"
于 2010-03-20T21:20:48.180 に答える