毎週火曜のラブライブだけを生きがいにしてたのに今週は休みと知ってとてつもなく絶望している今日
前提
phpにはjson形式の文字列を配列やオブジェクトなどに変換してくれるjson_decode
という関数が存在します。
関数についての細かいことは省略
このjson_decodeは基本的に非json形式の文字列を入れるとnullを返します。
// NULL
json_decode( 'abcdefg' );
また、入力値が整数の場合はint、少数の場合はfloatとして数値が返ってきます。
// int(123456)
json_decode( '123456' );
// int(123456)
json_decode( 123456 );
// float(123.456)
json_decode( 123.456 );
ここまでは問題なし。
本題
問題なのは入力された文字列が、指数表記として解釈できるとき。(指数表記:1.0E+10
みたいなやつ)
json_decodeは指数表記の文字列を受け取った際に自動的にfloatへ変換してしまいます。
詳しく調べてないけど多分こんな感じ。
- 文字列中にeが1つのみ含まれていて、それ以外の文字が数字のもの
- eの位置が最初または最後ではないもの
例えば、下記の場合は全て問題なく(?)NULLが返りますが、
// 全部NULL
json_decode( 'e1234' );
json_decode( '1234e' );
json_decode( '1e23e4' );
下記は指数表記の条件を満たすためfloatに変換された値が出力されます。
// float(1000)
json_decode( '10e2' );
// float(1.0E+308)
json_decode( '1e308' );
// float(INF)
json_decode( '123e456' );
面白い挙動なので何故そうなるのか調べようかとも思ったのですが、面倒なので辞めました。
誰か教えてください。
まとめ
json_decodeにわざわざそんな値を入れることはないって?
いやいや、あるかも知れないじゃないですか。
知らんけど