LoginSignup
0
0

More than 1 year has passed since last update.

json_decodeに特定の文字列を入れるとINF(無限)になる

Last updated at Posted at 2022-09-06

毎週火曜のラブライブだけを生きがいにしてたのに今週は休みと知ってとてつもなく絶望している今日

前提

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にわざわざそんな値を入れることはないって?
いやいや、あるかも知れないじゃないですか。
知らんけど

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0