(を使用して)d値のarray
型キャストを行うjson_decode
と$assoc = false
、PHPは文字列インデックスを使用して配列を作成します。
$a = (array)json_decode('{"7":"value1","8":"value2","9":"value3","13":"value4"}');
var_export($a);
//array (
// '7' => 'value1',
// '8' => 'value2',
// '9' => 'value3',
// '13' => 'value4',
//)
そして、何らかの理由でこれらのインデックスにアクセスできません。
var_dump(isset($a[7]), isset($a['7']));
//false
//false
PHP自体で同じ配列を作成しようとすると、数値インデックスを使用して作成され(文字列は自動的に変換されます)、文字列と数値の両方を使用して値にアクセスできます。
$c = array('7' => 'value1', '8' => 'value2', '9' => 'value3','10' => 'value4');
var_export($c);
var_dump(isset($c[7]), isset($c['7']));
//array (
// 7 => 'value1',
// 8 => 'value2',
// 9 => 'value3',
// 13 => 'value4',
//)
//
//true
//true
ここで何が起こっているのか誰か知っていますか?それは古いPHPバージョンのバグですか(この問題はPHPバージョン> = 7.2で修正されているようですが、変更ログに関連するものが見つかりません)?
これが起こっていることのデモです:https://3v4l.org/da9CJ。
これは、7.2.0で修正されたバグ#61655に関連しているようです。
オブジェクトプロパティでは、名前によるルックアップは常に文字列ですが、配列では数値文字列( "22200"など)キーは数値に変換されますが、文字列には変換されなくなります。変換内部HashTableが変更されていない場合、変換後、キールックアップは失敗します。
明確化:$a["2000"]
常にとして解釈されますが$a[2000]
、(array)
オブジェクト文字列キーを数値にキャストできませんでした。したがって、配列には文字列数値インデックスが含まれていましたが、配列構文の自動キャストにより、それらにアクセスできませんでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加