3

次のような JSON があります。

{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"}, 
 "data": "ABCDEFG", 
 "data2": "TSXPIIF"}

次の PHP コードを使用してデコードします。

$jsonOutput = json_decode($output);

JSONデータから「internalArray」にアクセスしたいので、以下で参照します。

$internalArray = $jsonOutput->{'internalArray'};

$internalArray で var_dump を実行すると

object(stdClass)#4 (4) 
{ ["201"]=> string(1) "A" 
     ["202"]=> string(1) "B" 
     ["5"]=> string(1) "C" 
     ["46"]=> string(1) "D" 
} 

これを配列にキャストできることがわかったので、次のようにしました。

$internalArray = (array) $jsonOutput->{'internalArray'};

ただし、この配列を取得したので、次のような値を使用してアクセスすることはできません

$internalArray["202"], $internalArray["201"], etc.

キー経由でアクセスしようとすると、NULL が返されます。ただし、次のようなコードがある場合:

foreach ($internalArray as $key => $value)
{
  echo $key . "," . $value;
}

「202、A」など、期待どおりの値が出力されます。

ただし、同じコードで次のように変更すると、

foreach ($internalArray as $key => $value)
{
  echo $key . "," . $internalArray[$key];
}

うまくいきません!

キーを使用して $internalArray の値にアクセスできない理由を誰か説明できますか? ここで根本的に間違ったことをしていますか?

4

2 に答える 2

8

連想配列が必要な場合は、PHP に連想配列を要求できます ( のドキュメントを参照json_decode)。

$jsonOutput = json_decode($output, true);

var_dump($jsonOutput['internalArray']);

プロデュース:

array(4) {
  [201]=>
  string(1) "A"
  [202]=>
  string(1) "B"
  [5]=>
  string(1) "C"
  [46]=>
  string(1) "D"
}

問題に戻ると、内部配列のキーが数値でない場合でも、コードは機能します。ここで起こっていることは少し奇妙です: PHP では、数値文字列 (例: '201''46') を配列のキーとして使用することはできません。

数値文字列キーは代わりに数字キーに変換されます。$arr['201']そのため、PHP を実行すると、代わりに検索されます$arr[201]。ただし、オブジェクトを配列にキャストすると、配列のキーが文字列のままのように見えます (例: $arr['201'])。実際の配列には数値文字列キーがありますが、それにアクセスしようとすると、PHP は int キーを探しますが、見つからないため、NULL.

実際、ドキュメントには次のように記載されています。

オブジェクトが配列に変換される場合、結果は要素がオブジェクトのプロパティである配列になります。キーはメンバー変数名ですが、いくつかの注目すべき例外があります。整数プロパティにはアクセスできません。(...)

于 2012-10-11T05:18:27.753 に答える
1

データは配列ではないため、オブジェクトです。したがって、このコード スニペットでは使用できません

foreach ($internalArray as $key => $value)
{
   echo $key . "," . $internalArray[$key];
}

連想配列に使用json_decode($output, true);

于 2012-10-11T05:18:23.910 に答える